以下是我的算法找到第一个共同的祖先。但我不知道如何计算它的时间复杂度,任何人都可以帮忙吗?如何查找二叉树中节点的第一个共同祖先?
public Tree commonAncestor(Tree root, Tree p, Tree q) {
if (covers(root.left, p) && covers(root.left, q))
return commonAncestor(root.left, p, q);
if (covers(root.right, p) && covers(root.right, q))
return commonAncestor(root.right, p, q);
return root;
}
private boolean covers(Tree root, Tree p) { /* is p a child of root? */
if (root == null) return false;
if (root == p) return true;
return covers(root.left, p) || covers(root.right, p);
}
我有问题。在你的陈述中... _let's_ _determine_ __tire_ _path_ __ _ p _ _和_ q'。 _This_ _takes_'O(n)'_just_ _like_'cover' ...不应该从根节点到节点'p'的路径取代'O(n)'而使用'O(log n)'? – Bhaskar 2011-05-11 22:11:38
@Bhaskar。假设树大致平衡,该路径的长度确实是'O(log n)',但是由于必须从根搜索节点,因此_finding_路径需要'O(n)',并且它可能位于任何位置在树中,所以你必须在最坏的情况下搜索它。如果你有从父节点到节点的指针,你确实可以通过向上遍历在'O(log n)'中找到这条路径。 – hammar 2011-05-11 22:16:35