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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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


题目描述

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

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

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


解题过程

解题思路

利用队列的先进先出原则,将每层的节点依次入队。再用一个循环遍历队列中的每一个节点,更新next的值。
1、创建FIFO的队列,并将根节点入队;
2、while循环,循环结束的条件是队列为空;
3、while循环中,创建list列表用于保存一层遍历的结果;
4、while循环中,计算当前队列中的元素个数size;
5、while循环中,用一个for循环遍历size大小的队列,每一个被遍历到的节点,更新next的指向,同时查看该节点是否存在左、右子节点,若存在则入队,入队顺序是先左后右;
6、while循环结束,返回res;

代码如下:

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if(root == null){
            return root;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);//入队根节点
        while(!queue.isEmpty()){
            int length = queue.size();
            for(int i = 0; i < length; i++){
                Node node = queue.poll();
                if(i == length - 1){//队列到头了,表示当前节点没有next可用,next要指向空
                    ;//node.next = null;
                }else{
                    node.next = queue.peek();//前面已经出过队了,这时队头就是所需要的next指向
                }
                //要更新队列
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
        }
        return root;
    }
}

总结

暂时没有总结,待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值