以下是我的算法找到第一個共同的祖先。但我不知道如何計算它的時間複雜度,任何人都可以幫忙嗎?如何查找二叉樹中節點的第一個共同祖先?
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