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

Populating Next Right Pointers in Each Node II

2015-01-04 12:57 435 查看
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 基本一致  只是在向队列中加入子节点时要对左右节点分别判断 代码如下:

public class Solution {
public void connect(TreeLinkNode root) {
if(root==null) return ;
int count=1;
int level=0;
Queue<TreeLinkNode> que =new LinkedList<TreeLinkNode>();
que.offer(root);
while(que.isEmpty()!=true){
level=0;
for(int i=0;i<count;i++){
root=que.peek();
que.poll();
if(i<count-1){
root.next=que.peek();
}else{
root.next=null;
}
if(root.left!=null){
que.offer(root.left);
level++;
}
if(root.right!=null){
que.offer(root.right);
level++;
}
}
count=level;
}
}
}
要求空间负载度为常数  所以上方法不满足要求 与I一样 对上一层节点的next处理完后再处理下一层节点 只是考虑下层节点时 要分别考虑其左右子节点的空否状态 PS:进行递归时 要先右再左 右边节点完成后才能使得左边的next节点得到完善 代码如下:
<pre name="code" class="java">public class Solution {
public void connect(TreeLinkNode root) {
if(root==null)return ;
if(root.left!=null){
if(root.right!=null){
root.left.next=root.right;
}else{
TreeLinkNode p=root.next;
while(p!=null){
if(p.left!=null){
root.left.next=p.left;
break;
}
if(p.right!=null){
root.left.next=p.right;
break;
}
p=p.next;
}
}
}
if(root.right!=null){
TreeLinkNode p=root.next;
while(p!=null){
if(p.left!=null){
root.right.next=p.left;
break;
}
if(p.right!=null){
root.right.next=p.right;
break;
}
p=p.next;
}
}

connect(root.right);
connect(root.left);
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  binary Tree 遍历 递归