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

这道题是Populating Next Right Pointers in Each Node的加强版,更适合一般情况,所以这道题的解法也适合Populating Next Right Pointers in Each Node。
对每一层,如果这一层节点已经连接好,那么可以通过next指针遍历这一层的所有节点,所以,也就可以按顺序遍历到这些节点的所有子节点,那么,也就可以按顺序将这些子节点连接。
问题是,连接好的子节点链头需要被记录下来,因为这样才能进行下一次遍历,将这些子节点的子节点们连接起来。
这里使用一个函数将这个功能封装起来,输入是待遍历层的头节点,子节点连接后,返回连接好的子节点链头(即下一层的头节点)。
函数中在遍历前新建一个辅助节点helper,helper的next指针指向第一个子节点(如果有的话)。这样,返回值就可以通过helper的next指针得到。
具体过程为,父层的遍历指针cur遍历到每个节点时,都讨论左子节点和右子节点。子层的遍历指针children从helper开始,遇到当前父层节点有左子就把当前children的next指针指向左子并把children指向左子。如果有右子也是一样。如此可以将所有子节点连接。
对所有层从上往下进行这样的函数调用,则可以把整个树每层子节点都连接起来。 注意,空间复杂度依然为O(1)因为函数中新建的辅助节点所占内存在出函数中会被释放。
代码:
     public void connect(TreeLinkNode root) {
TreeLinkNode levelStart = root;
while(levelStart!=null)
levelStart = connectChildren(levelStart);
}
public TreeLinkNode connectChildren(TreeLinkNode root) {
TreeLinkNode cur = root;
TreeLinkNode helper = new TreeLinkNode(0);
TreeLinkNode children = helper;
while(cur!=null) {
if(cur.left!=null) {
children.next = cur.left;
children = children.next;
}
if(cur.right!=null) {
children.next = cur.right;
children = children.next;
}
cur = cur.next;
}
return helper.next;
}

[Leetcode][JAVA] Populating Next Right Pointers in Each Node II的更多相关文章

  1. [LeetCode] 117. 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 ...

  2. [Leetcode Week15]Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/popul ...

  3. 【leetcode】Populating Next Right Pointers in Each Node II

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

  4. Leetcode 树 Populating Next Right Pointers in Each Node II

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Populating Next Right Pointers in Each Node II ...

  5. Java for LeetCode 117 Populating Next Right Pointers in Each Node II

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

  6. leetcode 117 Populating Next Right Pointers in Each Node II ----- java

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

  7. Leetcode 之Populating Next Right Pointers in Each Node II(51)

    void connect(TreeLinkNode *root) { while (root) { //每一层循环时重新初始化 TreeLinkNode *prev = nullptr; TreeLi ...

  8. Leetcode#117 Populating Next Right Pointers in Each Node II

    原题地址 二叉树的层次遍历. 对于每一层,依次把各节点连起来即可. 代码: void connect(TreeLinkNode *root) { if (!root) return; queue< ...

  9. LeetCode: Populating Next Right Pointers in Each Node II 解题报告

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

随机推荐

  1. Jmeter组件5. 逻辑控制

    逻辑控制组件也有不少,但是用到的情况也不多,只打算举个While controller结合Regular Expression Extractor的例子 Condition,跳出循环的条件 如果放空, ...

  2. teamviewer现在无法捕捉屏幕,这可能是由于快速的用户切换或远程桌面会话已经断开

    解决方法:      不用远程连接过去开启teamview,直接在在电脑本机上手动开启teamview就可以了 即:如果是mstsc远程过去开启,则会有这个错误提示,需要让服务器连接显示器,手动去登录 ...

  3. java学习第5天

    一维数组完了就是二维数组,和一位数组类似 .我们定义二维数组用的是 int[] []arr=new int[m][n],与一维类似,它在堆内存中存放,并以地址的形式访问,如下图..   而遍历二维数组 ...

  4. delphi检查url是否有效的方法

    function CheckUrl(url: string; TimeOut: integer = 5000): boolean;var hSession, hfile, hRequest: hInt ...

  5. 底部tab的返回退出和对话框

    第一种: private long exitTime = 0; @Override public boolean dispatchKeyEvent(KeyEvent event) { if (even ...

  6. buildroot 使用小记 - 2 源文件目录结构

    官方下载下来的buildroot源码包在解压后,是一个名为buildroot的文件夹,它下面的目录/文件结构如下: Makefile - 顶级makefile,编译总入口 Config.in - 顶级 ...

  7. Aborting commit: 'XXX' remains in conflict

    Aborting commit: 'XXX' remains in conflict 错误   本地也删除了一个文件夹,用svn 的repo-brower 删除了服务器上的对应的文件夹 ,再次comm ...

  8. SQLServer2008R2 mdf文件还原数据库

    偶然遇到要用mdf文件restore数据库,试了2个小时才弄出来,百度查出来的我试了都不太好用,或者是我没理解. 下面把我用的记录一下,以防忘记. 工具:SQLServer 2008R2 步骤: 1. ...

  9. java自带BASE64工具进行图片和字符串转换

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  10. elasticsearch Java API汇总

    http://blog.csdn.net/changong28/article/details/38445805#comments 3.1 集群的连接 3.1.1 作为Elasticsearch节点 ...