📅  最后修改于: 2023-12-03 15:26:09.366000             🧑  作者: Mango
在二叉树中,最近公共祖先(LCA)是两个节点p和q的最近公共祖先节点。给定一个二叉树和两个节点p和q,找到它们的LCA。
递归法
如果当前节点p和q都在左子树中,则递归左子树。相反地,如果它们都在右子树中,则递归右子树。否则,当前节点就是该LCA。
迭代法
在树中遍历到p或q节点时,需要将每一个节点的祖先节点保存在一个哈希表中。遍历节点q的祖先节点,并返回第一个同时也是p的祖先节点。
递归法
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root or root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left or right
迭代法
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
parent = {root: None}
stack = [root]
while p not in parent or q not in parent:
node = stack.pop()
if node.left:
parent[node.left] = node
stack.append(node.left)
if node.right:
parent[node.right] = node
stack.append(node.right)
ancestors = set()
while p:
ancestors.add(p)
p = parent[p]
while q not in ancestors:
q = parent[q]
return q
递归法的时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。迭代法的时间复杂度同样为O(n),空间复杂度为O(n)。两种方法都是常用的解法,在实际应用中需要根据具体情况来选择使用哪种方法。