다음은 첫 번째 공통 조상을 찾는 알고리즘입니다. 그러나 시간 복잡성을 계산하는 방법을 모르겠습니다. 누구든지 도와 줄 수 있습니까?이진 트리에서 노드의 첫 번째 공통 조상을 찾는 방법은 무엇입니까?
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);
}
질문이 있습니다. 귀하의 진술에 ... _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _This_ _takes_'O (n)'_just_ _like_'cover' ... 루트에서 노드'p'까지의 경로가'O (n)'대신'O (log n)'을 가져야하지 않습니까? – Bhaskar
@Bhaskar. 트리는 대략 균형을 맞춘다 고 가정 할 때 길이는'O (log n)'이 될 것이지만 _finding_이 경로는 루트에서 노드를 검색해야하므로'O (n)'을 취합니다. 나무에서 당신은 최악의 경우에 모든 것을 검색해야합니다. 노드에서 부모 노드까지 포인터를 가지고 있다면 실제로 위의 경로를 통해 'O (log n)'에서이 경로를 찾을 수 있습니다. – hammar