Leetcode算法二叉树—117. 填充每个节点的下一个右侧节点指针 II(层序遍历/队列)

目录

117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)

题解:

代码:

运行结果: ​编辑


给定一个二叉树:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

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

示例 1:

Leetcode算法二叉树—117. 填充每个节点的下一个右侧节点指针 II(层序遍历/队列)_第1张图片

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

示例 2:

输入:root = []
输出:[]

提示:

  • 树中的节点数在范围 [0, 6000] 内
  • -100 <= Node.val <= 100

题解:

  • 定义了一个connect()方法,接受一个Node类型的参数root,表示二叉树的根节点。如果根节点为空,直接返回。然后创建一个队列queue,用于层序遍历二叉树。
  • 接下来,将根节点入队。
  • 进入循环,只要队列不为空,就继续执行。在每一轮循环中,先获取当前层级上的节点个数size,并将上一个处理的节点last和当前节点node初始化为null。
  • 然后,在内层循环中,通过出队操作弹出一个节点node。如果上一个节点last不为空,将其next指针指向当前节点node,实现相邻节点的连接。
  • 同时,如果当前节点的左子节点不为空,则将其左子节点入队;如果当前节点的右子节点不为空,则将其右子节点入队。
  • 最后,更新last为当前节点node,以备下一次循环使用。
  • 当所有节点都遍历完毕后,返回根节点root即可。
  • 这段代码的核心思想是利用队列进行层序遍历,并在遍历过程中连接相邻节点。通过这种方式,可以实现二叉树节点的"下一个右侧节点"连接。

代码:

/*
// 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 queue=new LinkedList<>();
        // 根节点进队
        queue.offer(root);
        Node last;//上一个队首
        Node node;//当前队首
        int size=0;
        while(!queue.isEmpty()){//通过队列的size横向控制每层的遍历
            size=queue.size();
            last=null;//每一层开始的上一个节点为空
            while(size>0){
                // 获取队首(由于只能获取队首而不是前两个,所以我们用提前存储上一个节点与当前获取的队首链接)
                node=queue.poll();//获取当前节点
                if(last!=null) last.next=node;//不为空说明他们是一层的,连接起来
                if(node.left!=null) queue.offer(node.left);//子节点入队
                if(node.right!=null) queue.offer(node.right);
                last=node;
                size--;
            }
        }
        return root;
    }
}

运行结果: Leetcode算法二叉树—117. 填充每个节点的下一个右侧节点指针 II(层序遍历/队列)_第2张图片

你可能感兴趣的:(题解,算法,leetcode,java)