📅  最后修改于: 2023-12-03 15:40:00.440000             🧑  作者: Mango
二叉树是一种常见的数据结构,用于解决各种问题。问题 9 指的是给定两个结点,找出它们的最近公共祖先(LCA)。
最近公共祖先指的是指定结点在二叉树中的最近公共祖先,即两个结点的深度最浅的公共祖先。
找到左右子树中是否有目标结点,如果有,则返回该子树的 LCA,如果没有,则说明目标结点在当前结点的相同一边,返回当前结点。
def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if not left:
return right
if not right:
return left
return root
使用栈进行迭代,当栈中的根结点的左右子树已经被访问过时,将该结点弹出栈,访问其父节点。
def lowestCommonAncestor(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
stack = [root]
parent_dict = {root: None}
while p not in parent_dict or q not in parent_dict:
node = stack.pop()
if node.left:
parent_dict[node.left] = node
stack.append(node.left)
if node.right:
parent_dict[node.right] = node
stack.append(node.right)
ancestors = set()
while p:
ancestors.add(p)
p = parent_dict[p]
while q not in ancestors:
q = parent_dict[q]
return q
在二叉树中查找指定结点的最近公共祖先,可以使用递归或迭代的方式实现。递归法的时间复杂度为 $O(n)$,而迭代法需要使用栈,时间复杂度为 $O(n)$。