给定一个二叉树

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":null,"next":null,"right":{"$id":"6","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":null,"right":null,"val":7},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"6","left":null,"next":null,"right":{"$ref":"5"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"6"},"val":1}

解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答:

解法1:递归:

对于这里的题目与上题是非常类似的,但是这里不是完美二叉树,所以需要考虑的更多,

对于那两步可能就不一定都有了,只有左右子节点都有才会有,如果少一个那么只需要找一个节点的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&&root.right==null))
22 return root;
23 if(root.left!=null)
24 {
25 if(root.right!=null)
26 {
27 root.left.next=root.right;
28 root.right.next=findNext(root.next);
29 }
30 else
31 {
32 root.left.next=findNext(root.next);
33 }
34 }
35 else
36 {
37 root.right.next=findNext(root.next);
38 }
39 connect(root.right);
40 connect(root.left);
41
42 return root;
43
44 }
45 public Node findNext(Node root)
46 {
47 if(root==null)
48 return null;
49 else
50 {
51 if(root.left!=null||root.right!=null)
52 {
53 if(root.left!=null)
54 return root.left;
55 else
56 return root.right;
57 }
58 else
59 return findNext(root.next);
60
61 }
62 }
63 }

解法2:迭代

还是一样的讨论左右节点存在的情况,一样的找next,注意这里递归的下一层是用last指向的第一个我们用到的存在子节点的节点,不然我们会在这一层一直找,找到null说明不存在下一层就结束了。

 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 last=root;
24 while(last!=null)
25 {
26 while(last!=null&&last.left==null&&last.right==null)
27 last=last.next;
28 if(last==null)
29 break;
30 Node cur=last;
31 while(cur!=null)
32 {
33 if(cur.left!=null)
34 {
35 if(cur.right!=null)
36 {
37 cur.left.next=cur.right;
38 cur.right.next=findNext(cur.next);
39 }
40 else
41 cur.left.next=findNext(cur.next);
42 }
43 else if(cur.right!=null)
44 {
45 cur.right.next=findNext(cur.next);
46 }
47 cur=cur.next;
48 }
49 if(last.left!=null)
50 last=last.left;
51 else
52 last=last.right;
53 }
54 return root;
55 }
56 public Node findNext(Node root)
57 {
58 if(root==null)
59 return null;
60 if(root.left!=null)
61 return root.left;
62 else if(root.right!=null)
63 return root.right;
64 return findNext(root.next);
65
66 }
67
68 }

leetcode117. 填充每个节点的下一个右侧节点指针 II的更多相关文章

  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. LeetCode OJ:Populating Next Right Pointers in Each Node II(指出每一个节点的下一个右侧节点II)

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

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

    Q: 给定一个二叉树 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. liunx命令的运用

    工作中用到了一些命令,记忆才深刻 1.查看服务器内存:free -h 2.查看服务器磁盘空间:df -h 3.切root用户:sudo su root 输入密码 4.查看liunx服务器下的所有用户: ...

  2. 走在深夜的小码农 Third Day

    Css3 Third Day writer:late at night codepeasant css简介 ​ CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.​ ...

  3. Serilog 源码解析——总览

    背景 大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下.考虑到最近在自学 ASP.NET Core 的相关开发,对 Serilog 这个日志记录 ...

  4. DataStructure-enum枚举

    Enum:枚举类型 enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个模块为值创建明确定义的符号,而不是使用字面量整数或字符串. 创建枚举 可以使用class派生Enum,然后增加描述值得 ...

  5. Kubernetes 1.13 的完整部署手册

    前言: 非常详细的K8s的完整部署手册,由于Kubernetes版本和操作系统的版本关系非常敏感,部署前请查阅版本关系对应表 地址:https://github.com/kubernetes/kube ...

  6. Java集合(类)框架(二)

    1.Set集合 1.1 HashSet集合 HashSet底层为哈希码 不是数组,因此没有下标的概念,也就不能根据下标来查询某个元素 存放元素无序,不可重复 1.1.1 声明 Set<Strin ...

  7. uniApp打卡日历

    功能 滑动切换时间,打点功能,支持月周切换日历组件    这是一款支持滑动切换以及周模式和月模式切换功能的日历组件,可以设置打卡信息,自定义样式. 组件样式使用了sass所有需要项目中先安装node- ...

  8. 微信小程序授权页面

    这里也是比较简单的 直接复制粘贴就可以用,可能图片位置不对.. <template> <view id="imporwer"> <image src= ...

  9. .netcore简单集成swagger

    为什么要集成Swagger 在前后端分离比较普遍的当下,当后端开发完接口后,还需把接口的信息.参数说明.返回参数等信息编写好提供给调用者.对于对外开放接口需提供说明文档是必不可少的.但是对于内部开发, ...

  10. 【Android Studio】安卓开发初体验2——Activity

    Activity是什么 Activity用于提供可视化用户界面的组件,可以与用户进行交互来完成某项任务,一个应用程序中可以包含零个或多个活动 Activity的创建 首先将左侧的Active Tool ...