以下是我寻找第一个共同祖先的算法。但我不知道如何计算它的时间复杂度,有人可以帮忙吗?
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);
}
p
和q
_的整个路径。这需要O(n)
,就像cover
一样... 根节点到节点p
的路径不应该是O(log n)
而不是O(n)
吗? - BhaskarO(log n)
,但是_查找_此路径需要O(n)
,因为您必须从根节点开始搜索节点,并且它可能在树的任何位置,因此在最坏情况下必须搜索整个树。如果您有从节点到其父节点的指针,则可以通过向上遍历以O(log n)
的时间找到此路径。 - hammar