Populating Next Right Pointers in Each Node II

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);
    }
}




                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值