给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

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. 填充每个节点的下一个右侧指针的更多相关文章

  1. [leetcode-117]填充每个节点的下一个右侧节点指针 II

    (1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node { int val; Node *left; Node *right; Nod ...

  2. [LeetCode] 116. 填充每个节点的下一个右侧节点指针

    题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ...

  3. Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)

    117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每 ...

  4. Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针

    116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...

  5. 117. 填充每个节点的下一个右侧节点指针 II

    Q: 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右 ...

  6. leetcode117. 填充每个节点的下一个右侧节点指针 II

    给定一个二叉树struct Node {  int val;  Node *left;  Node *right;  Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...

  7. leetcode 117. 填充每个节点的下一个右侧节点指针 II(二叉树,DFS)

    题目链接 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/ 题目大意 给定一个二叉树 s ...

  8. 【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  9. leetcode 116填充每个节点的下一个右侧节点指针

    time O(n) ,sapce O(n) /* // Definition for a Node. class Node { public: int val; Node* left; Node* r ...

随机推荐

  1. Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection

    目录 Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Generalized Focal L ...

  2. ZooKeeper CentOS7上安装

    下载http://www.apache.org/dyn/closer.cgi/zookeeper(我下的是zookeeper-3.4.14) 1.创建 /usr/local/services/zook ...

  3. AtCoder Grand Contest 013D: Piling Up 题解

    题意简化: [luogu] Piling Up 一开始有n个颜色为黑白的球,但不知道黑白色分别有多少,m次操作,每次先拿出一个球,再放入黑白球各一个,再拿出一个球,最后拿出的球按顺序排列会形成一个颜色 ...

  4. 微信小程序-游记分享(无后台)

    游记分享 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus/zjcsxy/SE ...

  5. Python3网络学习案例三:编写web server

    1. 写在前面 这里总结的并不够详细,有时间了再进行补充. 2. 设计思路 HTTP协议是建立在TCP上的1. 建立服务器端TCP套接字(绑定ip,port),等待监听连接:listen(2. 打开浏 ...

  6. python socket 二进制

    问题 在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),在交测之前,自己用python写个接受数据的server,解析下拼成的数据格式是否正确.用python写 ...

  7. 【HNOI】分数分解

    题意描述 近来 IOI 专家们正在进行一项有关整数方程的研究,研究涉及到整数方程解集的统计问题,问题是这样的. 对任意的正整数 \(n\),我们有整数方程: \[\frac{1}{x_1}+\frac ...

  8. Python之list函数

  9. 微服务网关Zuul和Gateway的区别

    spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已.因为zuul ...

  10. rabbitmq集群搭建,镜像队列搭建

    原文地址:https://www.jianshu.com/p/11963564dd3d 教你如何从0开始搭建rabbitmq集群 一.准备工作 1.三台centos虚拟机 2.三台虚拟机都安装了doc ...