116. 填充每个节点的下一个右侧节点指针
原始题目链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A
所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next
指针连接,’#’ 标志着每一层的结束。
解题思路:
题目要求可以用递归,根据递归的三要素完成解题:
1. 定义递归函数的功能:以root节点为起始,从上到下完成串联
2. 寻找递归结束条件 :当前节点是空节点
3. 找出递归函数的等价关系式:递归调用树的左、右子节点
代码实现:
“”"
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root: 'Node') -> 'Node':
# 定义一个递归函数dfs(root):以root节点为起始,从上到下完成串联
def dfs(root):
# 递归结束条件:当前节点是空节点
if not root:
return
left_child_node = root.left
right_child_node = root.right
# 循环条件是当前节点的左子节点非空
while left_child_node:
# 左侧的子节点的next指针连接右侧节点
left_child_node.next = right_child_node
# 指向下一层的左子节点和右子节点
# 左侧子节点指向右侧,右子节点指向左侧
left_child_node = left_child_node.right
right_child_node = right_child_node.left
# 递归调用
dfs(root.left)
dfs(root.right)
dfs(root)
return root
参考文献:
https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/dong-hua-yan-shi-san-chong-shi-xian-116-tian-chong/