📜  数据结构|二叉树|问题13(1)

📅  最后修改于: 2023-12-03 15:26:09.366000             🧑  作者: Mango

数据结构 | 二叉树 | 问题13

介绍

在二叉树中,最近公共祖先(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)。两种方法都是常用的解法,在实际应用中需要根据具体情况来选择使用哪种方法。