填充每个节点的下一个右侧节点指针 II

给定一个二叉树

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

进阶:

你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
 

示例:

 

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

来源:力扣(LeetCode)
从图上很直观的可以看到就是在每层画了一条线,线穿过了点就用next相连,如果没有置空(因为类中默认为空所以在实际编写中不操作就可以了),所以我们需要按层操作二叉树,这里选用广度优先遍历即二叉树中的层遍历。我们要用一个结构去存储每一层的数据以方便我们对他操作,这里选用了队列,用栈也可以只是在要注意遍历顺序,用第二层举例,遍历到二时必须保证3还在存储状态。

之后是如何存储,我们要将每层的数据存储到队列中,那么也就是说如果我的队列中没有数据就说明当前二叉树已经遍历完了,之后是入队操作,首先让第一个节点入队,然后这是一个节点,那么就要判断他的左右孩子然后在根据是否为空入队,之后让该节点出队。这样一个循环就让我们能获得每层的节点,然后使用两个指针分别指向每层的某一个节点和他后面一个节点,然后根据当前队列中是否有数就可以判断他们是否相邻了。

public Node connect(Node root) {
        if(root==null)
        return null;
        Queue<Node> queue=new LinkedList<Node>();
        queue.offer(root);
        int number;
        Node temp=new Node();
        Node next=new Node();
        while(queue.size()!=0){
            number=queue.size();
            for(int i=0;i<number;i++){
                temp=queue.poll();
                if(temp.left!=null){
                    queue.offer(temp.left);
                }
                 if(temp.right!=null){
                    queue.offer(temp.right);
                }
                if(i!=0){
                    next.next=temp;
                }
                next=temp;

            }
        }
        return root;
        
    }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值