「每日LeetCode」2020年10月15日
本文最后更新于:2023年3月19日 晚上
Lt116. 填充每个节点的下一个右侧节点指针、dfs、队列、递归
116. 填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
1 |
|
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
示例:
1 |
|
提示:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
思路
非常数空间-队列实现
按不符合提议的非常数空间,可以有一种很简单的实现方式,队列层次遍历,只需要借用一个记录前一个节点地址的变量,每次遍历将上一个节点的 next 设为当前节点即可。
递归-dfs
参考「手画图解」DFS 递归 | 易于理解
如图所示,只有两种情况需要处理:
- 该节点存在 next,为左孩子,如 2,将左孩子的 next 指向右孩子,还需要将右孩子的 next 指向当前节点 next 的左孩子
- 该节点不存在 next,为 root 或右孩子,如 1,3,将左孩子的 next 指向右孩子
当为叶子节点,不存在左右孩子时跳出递归
最左指针-dfs
和上一个方法类似,使用一个最左指针,指向每一层的最左边的节点,之后进行每层层次遍历,处理逻辑基本同上:
- 当前节点存在 next,为左孩子,如 2,将左孩子的 next 指向右孩子,还需要将右孩子的 next 指向当前节点 next 的左孩子
- 当前节点不存在 next,为 root 或右孩子,如 1,3,将左孩子的 next 指向右孩子
- 遍历该层下一个节点,指向该节点的 next
解答
非常数空间-队列实现
1 |
|
递归-dfs
1 |
|
最左指针-dfs
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!