题解链接参考:https://labuladong.gitbook.io/algo/shu-ju-jie-gou-xi-lie/shou-ba-shou-shua-er-cha-shu-xun-lian-di-gui-si-wei/er-cha-shu-xi-lie-1
难度中等,本题思想在于细分,以及树的递归模板使用
写在前头
递归算法的关键要明确函数的定义,相信这个定义,而不要跳进递归细节。
写二叉树的算法题,都是基于递归框架的,我们先要搞清楚root节点它自己要做什么,然后根据题目要求选择使用前序,中序,后序的递归框架。
以及,二叉树题目的难点在于如何通过题目的要求思考出每一个节点需要什么,这个只能通过多刷题进行练习了。
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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 指针连接,'#' 标志着每一层的结束。
提示:
树中节点的数量少于 4096
-1000 <= node.val <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例:
题目意思很简单,就是要求把每一层的节点都串起来。
那么,先写出第一步的代码:
class Solution(object):
def connect(self, root: 'Node') -> Node:
# 递归退出条件
if root is None or root.left is None:
return
root.left.next = root.right
self.connect(root.left)
self.connect(root.right)
但是运行发现,不属于同一个父节点的子节点无法串起来。
所以,出现了一个需要常刷题才能想到的想法:
一个节点,不足以完成要求
开头说到,二叉树的难点在于,如何把题目的要求细化成每个节点需要做的事情
所以,我们增加一个函数,并且该函数的参数是由两个节点构成
def Solution(object):
def connect(self, root: 'Node') -> Node:
if root is None or root.left is None:
return root
self.connectTwoNode(root.left, root.right)
return root
# 写递归和重要的一点就是,相信自己的函数定义,不跳入递归中
def connectTwoNode(self, node1, node2):
if node1 is None or node2 is None:
return
# 前序遍历模板
node1.next = node2
# 细化后每一步左的事情
# node1将自己子节点连起来
self.connectTwoNode(node1.left, node1.right)
# node2将自己子节点连起来
self.connectTwoNode(node2.left, node2.right)
# node1,node2相邻的子节点连起来
self.connectTwoNode(node1.right, node2.left)
注释就是函数定义,不必想节点很多的时候会发生什么情况,这也是递归一开始提到的例子,汉诺塔问题的思想。
大象放入冰箱有几步。不考虑细节,相信函数定义