如何使用自下而上递归在二叉树中找到最低共同祖先

时间:2015-01-04 19:20:58

标签: algorithm recursion binary-tree

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

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

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

1 个答案:

答案 0 :(得分:3)

如果链接发生变化,您链接的算法将在下面重现:

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 ,它是 p q 的祖先,并询问它是否是最低共同祖先,基本上有三种可能性:

  1. p q 都是 n 的左子女的后代,但不是正确的孩子;
  2. p q 都是 n 的正确子女的后代,但不是左子女的后代;
  3. p q 都是 n 的两个孩子的后代。
  4. 这是整个算法背后的想法。我们从根开始,向下工作。我们递归地找到当前节点的左子 l p q 的LCA,以及右子 r

    如果左侧搜索返回了某些内容,但右侧搜索没有返回,那么这意味着左侧搜索找到了正确的值(因为答案比当前节点低,并且 l 本身或 l 的后代。同样,如果右手搜索返回了某些内容,但左手搜索没有。

    如果左手和右手搜索都返回了某些内容,那么 p q 都是 n 的后代。这意味着我们可以将 n 作为LCA返回:它不能更低,因为否则我们会在递归搜索中找到它;它是一个共同的祖先,因此它必须是最低的祖先。

    (顺便说一下,这种语言并不是特别有用:我已经说过你想要的祖先是树中最高的祖先,但是你在&#中39;重看,最低似乎意味着最接近根。)