返回

二叉树中最近公共祖先的详解

见解分享

什么是二叉树的最近公共祖先?

在二叉树中,两个节点的最近公共祖先(Lowest Common Ancestor,简称 LCA)是指这两个节点在树中的最近祖先节点。

如何找到二叉树中两个节点的最近公共祖先?

深度优先搜索(DFS)算法

DFS算法是一种遍历二叉树的算法,它从根节点开始,沿着一条路径向下遍历,直到找到目标节点。如果目标节点位于当前路径上,则返回该节点。否则,回溯到父节点,继续沿着另一条路径向下遍历,直到找到目标节点。

广度优先搜索(BFS)算法

BFS算法也是一种遍历二叉树的算法,它从根节点开始,将所有与根节点相邻的节点放入队列。然后,将队列中的第一个节点出队,并将其相邻的节点放入队列。以此类推,直到找到目标节点。

DFS算法的实现

def find_lca(root, p, q):
    if not root:
        return None

    # 如果当前节点就是p或q,则返回当前节点
    if root.val == p.val or root.val == q.val:
        return root

    # 递归查找左子树
    left_lca = find_lca(root.left, p, q)

    # 递归查找右子树
    right_lca = find_lca(root.right, p, q)

    # 如果左子树和右子树都找到了p和q,则当前节点就是最近公共祖先
    if left_lca and right_lca:
        return root

    # 如果只有左子树找到了p或q,则左子树的最近公共祖先就是最近公共祖先
    if left_lca:
        return left_lca

    # 如果只有右子树找到了p或q,则右子树的最近公共祖先就是最近公共祖先
    if right_lca:
        return right_lca

    # 如果左子树和右子树都没有找到p或q,则当前节点不是最近公共祖先
    return None

BFS算法的实现

def find_lca(root, p, q):
    if not root:
        return None

    # 创建队列,并把根节点入队
    queue = [root]

    # 创建一个字典,用于存储每个节点的父节点
    parent = {root: None}

    # 循环队列,直到找到p和q
    while queue:
        # 出队一个节点
        node = queue.pop(0)

        # 如果当前节点就是p或q,则返回当前节点
        if node.val == p.val or node.val == q.val:
            return node

        # 如果当前节点有左子树,则把左子树入队,并把当前节点作为左子树的父节点
        if node.left:
            queue.append(node.left)
            parent[node.left] = node

        # 如果当前节点有右子树,则把右子树入队,并把当前节点作为右子树的父节点
        if node.right:
            queue.append(node.right)
            parent[node.right] = node

    # 如果没有找到p和q,则返回None
    return None

算法的复杂度分析

DFS算法和BFS算法的复杂度都是O(n),其中n是二叉树的节点数。

结语

二叉树的最近公共祖先算法是二叉树中一个重要的算法,它可以用于解决许多问题,例如查找两个节点之间的最短路径、计算二叉树的高度等。希望本文对您理解二叉树的最近公共祖先算法有所帮助。