117. 填充每个节点的下一个右侧节点指针 II
1. 题目
给定一个二叉树:
1 | struct Node { |
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
示例 1:
1 | 输入:root = [1,2,3,4,5,null,7] |
示例 2:
1 | 输入:root = [] |
提示:
- 树中的节点数在范围
[0, 6000]
内 -100 <= Node.val <= 100
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度。
2. 思路
已知题目要求按照层级串联节点,初始化
queue
队列,并在当root
为空时直接返回初始化
queue
队列后,将root
节点写入队列中解题思路为利用队列将每一层的节点进行横向串联,当
queue
队列不为空时,遍历队列中的元素问题的难点在于如何使用一个队列并且还能够记录下每一层的节点数量,可在外层循环进入后,记录下此刻的节点数量,即为每一层的节点数量
遍历队列整体分为两层循环,外层循环遍历的是二叉树的层级,内层循环即以上述获取到的每一层二叉树的节点数量进行遍历
后续基于上述节点数量进行内层遍历,遍历到当前节点时:
- 如果该节点为该层的最后一个节点,则直接返回
null
- 如果该节点不是当前层的最后一个节点,则将
node.next
指向queue.peekFirst()
完成横向串联
- 如果该节点为该层的最后一个节点,则直接返回
在遍历每一层节点时,需要实时检查节点的
left
和right
指针,如果指针不为空,则追加写入队列以便后续遍历完成遍历串联后,返回
root
节点
3. 代码
1 | /* |
4. 复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)