5
以下は、バイナリ検索ツリーの最も一般的な祖先の実装です。バイナリツリー内の最も低い共通祖先
1)時間の複雑さはO(n)であり、空間の複雑さはO(n)悪い場合がありますが、BSTのバランスが取れている場合はO(logn)あれは正しいですか? 2)私のソリューションはバイナリツリーだけでなく、バイナリツリーにも拡張できます。
あなたからすぐにお聞きしたいと思います。
//The function findOrQueue is to enqueue all elements upto target node to a queue
public void findOrQueue(Node target, Node top, LLQueue q) {
int cmp = target.getData().compareTo(top.getData());
if(cmp == 0) {
q.enqueue(top);
return ;
}
else if (cmp < 0) {
q.enqueue(top);
findOrQueue(target, top.getLeftChild(),q);
}
else {
q.enqueue(top);
findOrQueue(target, top.getRightChild(),q);
}
}
public Node LCA(Node n1, Node n2) throws QueueEmptyException {
LLQueue q1 = new LLQueue();
LLQueue q2 = new LLQueue();
findOrQueue(n1,getRoot(),q1);
findOrQueue(n2,getRoot(),q2);
Node t = null;
while (!q1.isEmpty() && !q2.isEmpty()) {
Node t1 = (Node)q1.dequeue();
Node t2 = (Node)q2.dequeue();
if(t1.getData() != t2.getData()) {
return t;
}
else t = t1;
}
if(q1.isEmpty() && q2.isEmpty())
return null;
else
return t;
}
これは普通のバイナリツリーではうまくいかないのはなぜですか?私は特定のノード順序を要求するこのアルゴリズムのための条件を見ない。 – jma127
関数findOrQueueは、バイナリ検索ツリーであり、バイナリツリーではありません。 – ueg1990
なぜfindOrQueue()で比較を使用していますか?木の上を簡単に横断すれば十分です。 – jma127