如何使用自底向上递归在二叉树中找到最低公共祖先

How to find lowest common ancestor in binary tree using bottom up recursion

我很难理解如何使用自底向上递归在二叉树中找到最低共同祖先。

HERE 是看起来非常整洁的解决方案。我试着在一棵小树上晾干它,但没有成功。

有人可以帮忙解决这个问题吗?

您link编辑的算法复制如下,以防 link 发生变化:

public static Tree findLowestCommonAncestor(Tree root, Tree p, Tree q)
{
    if (root == null)
        return null;

    if (root == p || root == q)
        return root;

    Tree left = findLowestCommonAncestor(root.left, p, q);
    Tree right = findLowestCommonAncestor(root.right, p, q);

    if (left != null && right != null)
        return root;

    if (left != null)
        return left;
    else
        return right;
}

它是这样工作的。关键的观察是,如果我们考虑一个节点 n,它是 pq 的祖先,再问是不是最低共同祖先,基本有3种可能:

  1. pq 都是 n[=52= 的左 child 的后代],但不是正确的 child;
  2. pq 都是 n[=52= 的右 child 的后代],但不是左边 child;
  3. pq 都是 n[=52= 的 children 的后代].

这就是整个算法背后的思想。我们从根开始,一路往下。我们从左边child l递归地找到pq的LCA当前节点,以及当前节点的右childr

如果 left-hand 搜索 return 有结果,但 right-hand 搜索没有,那么这意味着 left-hand 搜索找到了正确的值(因为答案低于当前节点,并且 l 本身或 l 的后代)。类似地,如果 right-hand 搜索 return,但 left-hand 搜索没有。

如果 left-hand 和 right-hand 都搜索 return 东西,那么 pq 都是 n 的后代。这意味着我们可以 return n 作为 LCA:它不能更低,否则我们会在递归搜索中更早地找到它;而且是共同祖先,所以一定是最低的。

(语言不是特别有用,顺便说一句:我说过你想要的祖先是树中最高的,但在你正在看,lowest好像是最接近root的意思。)