目录
117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)
题解:
代码:
运行结果: 编辑
给定一个二叉树:
struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为
NULL
。初始状态下,所有 next 指针都被设置为
NULL
。示例 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<Node> 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;} }
运行结果: