答案 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 的祖先,并询问它是否是最低共同祖先,基本上有三种可能性:
这是整个算法背后的想法。我们从根开始,向下工作。我们递归地找到当前节点的左子 l 的 p 和 q 的LCA,以及右子 r 当前节点的em>。
如果左侧搜索返回了某些内容,但右侧搜索没有返回,那么这意味着左侧搜索找到了正确的值(因为答案比当前节点低,并且 l 本身或 l 的后代。同样,如果右手搜索返回了某些内容,但左手搜索没有。
如果左手和右手搜索都返回了某些内容,那么 p 和 q 都是 n 的后代。这意味着我们可以将 n 作为LCA返回:它不能更低,因为否则我们会在递归搜索中找到它;它是一个共同的祖先,因此它必须是最低的祖先。
(顺便说一下,这种语言并不是特别有用:我已经说过你想要的祖先是树中最高的祖先,但是你在&#中39;重看,最低似乎意味着最接近根。)