Python 使用递归实现获取二叉树中所有最深节点的最小子树。
对于获取二叉树中所有最深节点的最小子树的这个二叉树问题,可以使用深度优先搜索来遍历树,以下是具体步骤:
- 从根节点开始搜索。
- 使用一个整数来记录全局最大深度,使用一个变量记录当前最深节点的最小子树的根节点。
- 对每个节点进行深度优先搜索,递归遍历二叉树节点,在递归函数中维护全局最大深度,当检测到左右子树最大深度于全局最大深度一致时,更新相关最小子树的根节点。
以下是使用 Python 来实现的示例代码:
# 二叉树节点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def subtree_with_deepest(root):
ans = None
# 全局最大深度
max_depth = -1
def dfs(node, depth):
nonlocal ans, max_depth
if node is None:
# 维护全局最大深度
max_depth = max(max_depth, depth)
return depth
# 获取左右子树最深叶子节点的深度
left_max_depth = dfs(node.left, depth + 1)
right_max_depth = dfs(node.right, depth + 1)
if left_max_depth == right_max_depth == max_depth:
ans = node
# 当前子树最深叶子节点的深度
return max(left_max_depth, right_max_depth)
dfs(root, 0)
return ans
root=TreeNode(3)
root.right=TreeNode(7)
root.left=TreeNode(6)
root.left.left=TreeNode(5)
root.left.right=TreeNode(8)
res=subtree_with_deepest(root)
# 相关最小子树的根节点的值
print(res.val)
上述代码定义了一个函数subtree_with_deepest
,它将返回原始树中所有最深节点的最小子树,具体返回值是一个树节点,但通过该节点能访问到整个树的节点,即可认为它是该节点加上它的所有后代的集合。subtree_with_deepest
函数通过深度优先搜索,递归遍历二叉树的所有节点,并持续维护所遍历到的全局最大深度和全局最深节点的最小子树。该函数包含了一个递归函数,它接收当前节点和当前深度作为参数,返回当前子树最深叶子节点的深度。
时间复杂度:对于节点数为 n n n的二叉树,算法遍历了 n n n次节点,每次遍历只进行复杂度为 O ( 1 ) O(1) O(1)的操作,所以时间复杂度为 O ( n ) O(n) O(n)。
空间复杂度:对于节点数为 n n n的二叉树,最坏的情况为二叉树为一条链,递归需要 O ( n ) O(n) O(n)的栈空间,因此空间复杂度为 O ( n ) O(n) O(n)。