leetcode116. 填充每个节点的下一个右侧指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例:
输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}
输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
提示:
你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
解法1:递归
对于这个完美二叉树,其实对于每个节点,一共有两步,如图:

那么递归的过程就是这么两步,第一步是处理左子树的next,第二步处理右子树的next,那么这个根节点也就完成任务了,就可以往下递归了
也就是往左右子树递归。
1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public Node left;
6 public Node right;
7 public Node next;
8
9 public Node() {}
10
11 public Node(int _val,Node _left,Node _right,Node _next) {
12 val = _val;
13 left = _left;
14 right = _right;
15 next = _next;
16 }
17 };
18 */
19 class Solution {
20 public Node connect(Node root) {
21 if(root==null||root.left==null)
22 return root;
23
24 root.left.next=root.right;
25
26 if(root.next!=null)
27 root.right.next=root.next.left;
28
29 connect(root.left);
30 connect(root.right);
31 return root;
32 }
33 }
解法2:迭代
也就是不用list的层序遍历,怎么样才能不用list的额外空间呢?就是用这题目的next指针来引出下一个需要遍历的节点。
这里跟上面的区别就在于一个节点处理完了以后去处理左右子树的递归结构,然而这里不是这样,这里是处理完这一层的结构,再去处理下一层的结构,就这样一层层的遍历到最后一层结束。
1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public Node left;
6 public Node right;
7 public Node next;
8
9 public Node() {}
10
11 public Node(int _val,Node _left,Node _right,Node _next) {
12 val = _val;
13 left = _left;
14 right = _right;
15 next = _next;
16 }
17 };
18 */
19 class Solution {
20 public Node connect(Node root) {
21 if(root==null)
22 return null;
23 Node level=root;
24 Node worker=root;
25 while(level.left!=null)
26 {
27 worker.left.next=worker.right;
28 if(worker.next==null)
29 {
30 level=level.left;
31 worker=level;
32 }
33 else
34 {
35 worker.right.next=worker.next.left;
36 worker=worker.next;
37 }
38 }
39 return root;
40 }
41 }
解法3:递归的分割法
这里第三种看上去比较爽的,因为是完美二叉树,所以将树的结构分割成两半,将分割成两半的连起来的部分连起来,然后再往左右子树分割,是比较精彩的递归。
1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public Node left;
6 public Node right;
7 public Node next;
8
9 public Node() {}
10
11 public Node(int _val,Node _left,Node _right,Node _next) {
12 val = _val;
13 left = _left;
14 right = _right;
15 next = _next;
16 }
17 };
18 */
19 class Solution {
20 public Node connect(Node root) {
21 if(root==null)
22 return root;
23 Node left=root.left;
24 Node right=root.right;
25 while(left!=null)
26 {
27 left.next=right;
28 left=left.right;
29 right=right.left;
30 }
31 Node l=connect(root.left);
32 Node r=connect(root.right);
33 return root;
34 }
35 }
leetcode116. 填充每个节点的下一个右侧指针的更多相关文章
- [leetcode-117]填充每个节点的下一个右侧节点指针 II
(1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node { int val; Node *left; Node *right; Nod ...
- [LeetCode] 116. 填充每个节点的下一个右侧节点指针
题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ...
- Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)
117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每 ...
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...
- 117. 填充每个节点的下一个右侧节点指针 II
Q: 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右 ...
- leetcode117. 填充每个节点的下一个右侧节点指针 II
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...
- leetcode 117. 填充每个节点的下一个右侧节点指针 II(二叉树,DFS)
题目链接 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/ 题目大意 给定一个二叉树 s ...
- 【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- leetcode 116填充每个节点的下一个右侧节点指针
time O(n) ,sapce O(n) /* // Definition for a Node. class Node { public: int val; Node* left; Node* r ...
随机推荐
- 删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles
删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles 代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无 ...
- Java获取不到Canal服务器端数据问题汇总(坑人的东西)
情况1:(基本都是这样的问题,) 1.需要修改canal.properties配置 vim conf/canal.properties canal.instance.parser.parallelTh ...
- Python实现微信支付(三种方式)
Python实现微信支付(三种方式) 关注公众号"轻松学编程"了解更多. 如果需要python SDk源码,可以加我微信[1257309054] 在文末有二维码. 一.准备环境 1 ...
- 被巴菲特看中的Snowflake,是怎样深刻改变云计算产业的?
众所周知,在很长一段时间里,巴菲特都从来不碰科技股.但人总是会变的,他在2016年开始首次持仓苹果,并在此后一再增持,目前苹果为伯克希尔第一大重仓股. 前不久,巴菲特持股了人生中的又一家科技公司--S ...
- 由python工作区导致的python代码能运行,但是PyCharm画红线的问题
原文:https://www.zhihu.com/question/63028700 PyCharm在遇到模块找不到时,会使用红色波浪线提醒开发者. Python有一个工作区的概念,在默认情况下,当你 ...
- docker搭建redis集群
一.简介 docker作为一个容器技术,在搭建资源隔离性服务上具有很大的优势,在一台服务器上可以启动多个docker容器,感觉每个在容器里面部署的服务就像是部署在不同的服务器上.此次基于docker以 ...
- How to use vscode to build a springboot project
How to use vscode to build a springboot project 首先截图一个springboot官网的一个教程说明截图.可以根据这里的指南去创建一个HelloWorld ...
- 简单red5+obs推流实现直播系统开发,具体设置介绍
前言:随便搞搞,先放一张效果图,
- 微信告警如何配置?用Cloud Alert快速实现微信告警
在当下互联网蓬勃发展的时代里,微信已经成为了人们生活中不可分割的一部分.作为苦逼的运维人员,我们自然也得跟得上时代的步伐,将微信添加进告警的通知方式里.如果能够将告警消息第一时间发送到微信中,更清楚地 ...
- MYSQL 存储引擎(面)
存储引擎是MySQL的组件,用于处理不同表类型的SQL操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能. 使用哪一种引擎可以灵活选择,一个数据 ...