您的位置:首页 > Web前端 > Node.js

leetcode--populating_next_right_pointers_in_each_node

2016-10-28 20:51 381 查看

leetcode–populating_next_right_pointers_in_each_node

题意:给定一个二叉树结构,

public class TreeLinkNode {
int val;
TreeLinkNode left, right, next;
TreeLinkNode(int x) { val = x; }
}


每一个节点添加一个指针next(如上),指向该节点所在层中右边的节点,如果该节点右边没有其他节点,则将next指向null,开始时所有节点的next指针都是null。

条件: 1.只能常数的空间; 2.假设这是一棵完美二叉数(所有的叶子节点在同一层并且每一个父节点都有两个孩子)。

举例:给定如下的完美二叉树

1

/ \

2 3

/ \ / \

4 5 6 7

执行后该树应该如下图所示

1 -> NULL

/ \

2 -> 3 -> NULL

/ \ / \

4->5->6->7 -> NULL

分析:本题第一反应是使用广度优先遍历然后再结合满二叉树的性质(左孩子节点=2×父亲节点)来做。但是本题要求只能使用常数空间复杂度,广度优先遍历需要使用队列,不符合要求。

使用层次遍历,增加一个指针previous,指向已经构造好的当前层,假设已经构造好了第2层,则指向第2层的2节点,现在需要构造第3层:

2 -> 3 -> NULL

/ \ / \

4 5 6 7

增加一个指针present,指向当前需要构造的层。此时只需要遍历一遍第二层,在遍历到2时,将4节点的next设置为5,present指针指向5节点,previous节点向后移一个,此时previous指向3节点,它的左右孩子节点为6、7。将5节点的next设置为6节点,present指针向后移一位指向6节点,再将6节点的next设置为7节点,present指针再向后移一位指向7节点。由于初始所有节点的next指针均为NULL,所以第3层到这里就构造完毕。如果后面还有其他层的话,只需要将previous指针指向第3层的4节点,present指针指向第4层,以此类推执行即可。

代码

public void connect(TreeLinkNode root) {
if(root == null){
return;
}else{
TreeLinkNode previous = root;
TreeLinkNode present = null;
TreeLinkNode head = null;
while(previous.left != null){
while(previous != null){
if(present == null){
present = previous.left;
present.next = previous.right;
head = present;
present = present.next;
previous = previous.next;
}else{
present.next = previous.left;
present = present.next;
present.next = previous.right;
present = present.next;
previous = previous.next;
}
}
previous = head;            //previous指向下一层
present = null;             //present指向下一层
}
}
}


源程序下载

总结:使用该方法不用额外的创建太多空间,只需要创建3个指针即可,而且用上一层构建下一层这种方法也可以实现二叉树的层次遍历(不是满二叉树也可以这么做,不过需要加上判断条件,一般的层次遍历使用两个队列实现)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 leetcode java