LeetCode OJ - Populating Next Right Pointers in Each Node II

题目:

Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

  • You may only use constant extra space.

 

For example,
Given the following binary tree,

         1/  \2    3/ \    \4   5    7

 

After calling your function, the tree should look like:

         1 -> NULL/  \2 -> 3 -> NULL/ \    \4-> 5 -> 7 -> NULL

解题思路:

  方法一:直接进行广度优先遍历,在遍历的过程中对next指针赋值。

  方法二:可以利用生成的next指针来横向扫描,即得到一层的next指针之后,可以利用这一层的next指针来给下一层的next指针赋值。

代码:

  方法一代码:

  

/*** Definition for binary tree with next pointer.* struct TreeLinkNode {*  int val;*  TreeLinkNode *left, *right, *next;*  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}* };*/
class Solution {
public:void connect(TreeLinkNode *root) {if (root == NULL) {return;}queue<TreeLinkNode*> one;queue<TreeLinkNode*> another;one.push(root);TreeLinkNode* cur;TreeLinkNode* next;while(!(one.empty() && another.empty())) {if (!one.empty()) {cur = one.front();one.pop();if (cur->left != NULL) another.push(cur->left);if (cur->right != NULL) another.push(cur->right);while (!one.empty()) {next = one.front();one.pop();if (next->left != NULL) another.push(next->left);if (next->right != NULL) another.push(next->right);cur->next = next;cur = next;} cur->next = NULL;}if (!another.empty()) {cur = another.front();another.pop();if (cur->left != NULL) one.push(cur->left);if (cur->right != NULL) one.push(cur->right);while (!another.empty()) {next = another.front();another.pop();if (next->left != NULL) one.push(next->left);if (next->right != NULL) one.push(next->right);cur->next = next;cur = next;} cur->next = NULL;}}}
};

方法二代码:

/*** Definition for binary tree with next pointer.* struct TreeLinkNode {*  int val;*  TreeLinkNode *left, *right, *next;*  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}* };*/
class Solution {
public:TreeLinkNode *findNext(TreeLinkNode *head){while(head != NULL && head->left == NULL && head->right == NULL)head = head->next;return head;}void connect(TreeLinkNode *root) {if(root == NULL) return;TreeLinkNode *head, *last, *nexhead;for(head = root; head != NULL; head = nexhead){head = findNext(head);if(head == NULL) break;if(head->left != NULL) nexhead = head->left;else nexhead = head->right;for(last = NULL; head != NULL; last = head, head = findNext(head->next)){if(head->left != NULL && head->right != NULL)head->left->next = head->right;if(last == NULL) continue;if(last->right != NULL) last->right->next = head->left != NULL ? head->left : head->right;else last->left->next = head->left != NULL ? head->left : head->right;}}}
};

 

转载于:https://www.cnblogs.com/dongguangqing/p/3727925.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库---JDBC

1.1 JDBC概述JDBC&#xff08;Java DataBase Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范&#xff0c;可以为不同的关系型数据库提供统一访问&#xff0c;它由一组用Java语言编写的接口和类组成。 JDBC需要连接驱…

23种设计模式之简单工厂

简单工厂模式描述的是&#xff0c;通过类的继承关系&#xff0c;父类&#xff08;工厂类&#xff09;与子类&#xff08;产品类&#xff09;&#xff0c;调用父类中的方法&#xff0c;实际干活儿的是子类中的方法&#xff1b;封装需求的不确定性&#xff0c;做出通用的编程&…

原生JDBC操作数据库流程

1、class.forName()加载数据驱动 2、DriverManager.getConnection()获取数据库连接对象。 3、根据SQL或sql会话对象&#xff0c;有两种方式Statement、PreparedStatement。 4、执行sql处理结果集&#xff0c;如果有参数就设置参数。 5、关闭结果集&#xff0c;关闭会话&#xf…

verilog HDL 编码风格

1、有意义且有效的名字。 2、同一信号在不同层次应该保持一致。 3、添加有意义的后缀&#xff0c;使信号的有效性更加明确。 4、模块输出寄存器化&#xff0c;使得输出的驱动强度和输入延时是可以预测的。 5、使用括号表明优先级。 6、每一个if都应该有一个else。如果esle没有任…

为什么要使用PreparedStatement

(个人理解&#xff1a;执行速度&#xff0c;使用方便&#xff0c;代码的可读性维护性&#xff0c;提高性能&#xff0c;安全性 五个方面考虑) 1、PreparedStatement接口继承Statement&#xff0c;PreparedStatement实例包含了预编译的SQL语句&#xff0c;所以PreparedStatement…

session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!

标题简单描述&#xff1a;先将一个对象放入session&#xff0c;只对对象属性值进行修改&#xff0c;但不将修改后的对象存放session中&#xff0c;发现session中存放的对象属性值也相对应的改变。Person personnew PerSon(); request.getSession().setAttribute("person&q…

利用三层交换机实现VLAN间路由配置

利用三层交换机实现VLAN间路由配置 实验目标&#xff1a; 一、 掌握交换机Tag VLAN的配置&#xff1b; 二、掌握三层交换机基本配置方法&#xff1b; 三、 掌握三层交换机的VLAN路由的配置方法&#xff1b; 四、通过三层交换机实现VLAN见相互通信&#xff1b; 技术原理&#xf…

Maven,在pom.xml配置JDK 9版本。

<build><plugins><!-- 设置JDK 9版本 --><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> …

【leetcode】Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each paths sum equals the given sum. For example:Given the below binary tree and sum 22, 5/ \4 8/ / \11 13 4/ \ / \7 2 5 1 return [[5,4,11,2],[5,8,4,5] ] 下午做了个笔试没睡觉…

easyui、表格中添加操作一列,将操作下设置为修改,点击修改弹出该行对象的编号。

页面中的代码(自己引入easy插件)&#xff1a; <body> <div id"table"></div> </body> <script type"text/javascript"> $(function(){$(#table).datagrid({ url:tt.json, //显示的数据striped:true, …

被LTRIM(RTRIM())害死了,差点

LTRIM(character_expression)去掉前置空格 LTRIM(RTRIM())就是把前置和后置空格都去掉。 character_expression可以是常量、变量或列。character_expression必须属于某个可隐式转换为varchar的数据类型(text、ntext和image除外)。否则&#xff0c;请使用CAST显示转换character_…

Mybatis、使用注解的方式编写用户和角色一对多关系,并使用延迟加载

1、数据库准备 CREATE TABLE role ( ID INT(11) NOT NULL COMMENT 编号,ROLE_NAME VARCHAR(30) DEFAULT NULL COMMENT 角色名称,ROLE_DESC VARCHAR(60) DEFAULT NULL COMMENT 角色描述,PRIMARY KEY (ID) ) ENGINEINNODB DEFAULT CHARSETutf8;INSERT INTO role(ID,ROLE_NAME,…

织梦标签大全

关键描述调用标签&#xff1a; <meta name"keywords" content"{dede:field namekeywords/}"> <meta name"description" content"{dede:field namedescription functionhtml2text(me)/}"> -------------------------------…

spring的注入

1、构造函数注入的是设计到的标签&#xff1a;constructor-arg属性&#xff1a;index:指定参数在构造函数参数列表的索引位置type:指定参数在构造函数中的数据类型name:指定参数在构造函数中的名称上面三个都是找谁 &#xff0c;给谁赋值&#xff0c;下面两个指的是赋什么值 va…

.Net中堆栈和堆的区别

首先堆栈和堆&#xff08;托管堆&#xff09;都在进程的虚拟内存中。&#xff08;在32位处理器上每个进程的虚拟内存为4GB&#xff09; 堆栈stack 1、堆栈中存储值类型 2、堆栈实际上是向下填充&#xff0c;即由高内存地址指向低内存地址填充 3、堆栈的工作方式是先分配内存的变…

spring的IOC注解

1、创建对象的注解 含义&#xff1a;使用注解的形式创建对象&#xff0c;交给Spring容器管理(需要配置在类上) Component:组件 Controller:web层 Service:service层 Repository:Dao层默认&#xff1a;创建对象的唯一标识&#xff0c;当前类名首字母小写value属性&#xff1a;指…

PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM

从SQL文件逆向工程到PDM&#xff1a; ①选择file -> Reverse Engineer - > Database ②在General选项卡中选择MySQL数据库&#xff0c;点击确定。 ③using script file 选择你的sql文件&#xff0c;最后选择确定。 从PDM转成CDM&#xff1a; ①选择工具 -> General CD…

SpringMvc的执行过程

Tomcat启动 1、部署项目到Tomcat中 2、启动Tomcat加载Web.xml 3、初始化DispatcherServlet(执行的是init方法) 4、加载配置文件&#xff0c;创建对象交给Spring容器管理 5、通过处理器映射器解析RequestMappin配置&#xff0c;配置‘请求地址’和‘控制器类’的映射关系 小结&a…

自然语言理解——introduction

1.基本概念&#xff1a; NLP&#xff1a;自然语言处理是研究如何利用计算机技术对语言文本&#xff08;句子、篇章或话语等&#xff09;进行处理和加工的一门学科&#xff0c;研究内容包括对词法、句法、语义和语用等信息的识别、分类、提取、转换和生成等各种处理方法和实现技…

Eclipse中弹出OLE Exception窗口

楼主事故原因&#xff1a;首先打开一个类&#xff0c;然后因为手速太快&#xff0c;在该类的编辑窗口中右键&#xff0c;单击&#xff0c;不要问我点了啥&#xff0c;我也不知。后面发现该类的编辑器没有显示任何内容&#xff0c;但是可以发现代码依然存在只是没有显示。 关闭…