10月28,K神开课讲数据科学,你来吗?


一亩三分地论坛

 找回密码
 获取更多干活,快来注册
Babeltime游戏工作室招工程师、美术和策划
Tubi TV招安卓、前端和机器学习工程师
把贵司招聘信息放这里
查看: 841|回复: 1
收起左侧

[树/链表/图] Populating Next Right Pointers in Each Node I, II 疑问

[复制链接] |试试Instant~ |关注本帖
oio14644 发表于 2015-8-7 13:07:03 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
网上找到一个解法,没看太懂,请给指点一下


特别是这一句话:dummy停留在next level的开头


http://wlcoding.blogspot.com/2015/03/populating-next-right-pointers-in-each.html?view=sidebar








两道题可以用一个算法解决。


Time ~ O(N), Space ~ O(1)
逐行完成connection:
                         1 -> NULL
                       /    \
                     2  -> 3 -> NULL         curr moves from left to right (current level)
                    /  \      /  \
dummy -> 4->5->6->7 -> NULL    prev moves from left to right (next level)
注意:
  • prev = dummy 和接下来的 prev.next = curr.left or curr.right 使 dummy停留在next level的开头,然后用 prev = prev.next 将 prev 从左向右移动。
  • connect完一行(next level)后,调用 connect(dummy.next) 进入下一行(记得此时 dummy.next 为next level的开头)。

public void connect(TreeLinkNode root) {    if (root == null)   return;    // dummy is the node above curr    // dummy.next stores the leftmost node in the next level    TreeLinkNode dummy = new TreeLinkNode(0);    TreeLinkNode prev = dummy, curr = root;    while (curr != null) {        // when curr has any child:        // if it's the leftmost node, connect dummy.next to it         // otherwise. connect previous left node to it        if (curr.left != null) {            prev.next = curr.left;            prev = prev.next;        }        if (curr.right != null) {            prev.next = curr.right;            prev = prev.next;        }        curr = curr.next;    }    connect(dummy.next);    // go down to the next level}
 楼主| oio14644 发表于 2015-8-7 13:10:45 | 显示全部楼层
public void connect(TreeLinkNode root) {
    if (root == null)   return;
    // dummy is the node above curr
    // dummy.next stores the leftmost node in the next level
    TreeLinkNode dummy = new TreeLinkNode(0);
    TreeLinkNode prev = dummy, curr = root;
    while (curr != null) {
        // when curr has any child:
        // if it's the leftmost node, connect dummy.next to it
        // otherwise. connect previous left node to it
        if (curr.left != null) {
            prev.next = curr.left;
            prev = prev.next;
        }
        if (curr.right != null) {
            prev.next = curr.right;
            prev = prev.next;
        }
        curr = curr.next;
    }
    connect(dummy.next);    // go down to the next level
}
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-9-20 17:40

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表