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

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

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

介绍

二叉树是一种常见的数据结构,用于解决各种问题。问题 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)$。