目录
117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)
给定一个二叉树:
struct Node { int val; Node *left; Node *right; Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为
NULL
。初始状态下,所有 next 指针都被设置为
NULL
。示例 1:
扫描二维码关注公众号,回复: 17011756 查看本文章输入: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; } }
运行结果: