Populating Next Right Pointers in Each Node II

本文介绍了一种在二叉树中填充每个节点的Next指针的方法,确保同一层的相邻节点通过Next指针连接起来。讨论了如何在不使用额外的空间条件下实现这一目标,并给出了具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值