一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 321|回复: 1
收起左侧

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

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

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

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
}
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

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

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-10 23:26

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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