私のクラスのAVLツリーのバランスをとる方法を見つけようとしています。私はそれがこれで挿入持っている:AVLツリーのバランスをとる(C++)
Node* Tree::insert(int d)
{
cout << "base insert\t" << d << endl;
if (head == NULL)
return (head = new Node(d));
else
return insert(head, d);
}
Node* Tree::insert(Node*& current, int d)
{
cout << "insert\t" << d << endl;
if (current == NULL)
current = new Node(d);
else if (d < current->data) {
insert(current->lchild, d);
if (height(current->lchild) - height(current->rchild)) {
if (d < current->lchild->getData())
rotateLeftOnce(current);
else
rotateLeftTwice(current);
}
}
else if (d > current->getData()) {
insert(current->rchild, d);
if (height(current->rchild) - height(current->lchild)) {
if (d > current->rchild->getData())
rotateRightOnce(current);
else
rotateRightTwice(current);
}
}
return current;
}
私の計画は、(バランスをとるための呼び出しを持っていることでした)木がバランスをとる必要があり、必要に応じて、その後バランスをとるかどうかを確認します。問題は、正しいアンバランスノードを見つけるためにツリーをどのようにトラバースするのか把握できないことです。再帰的にツリーをたどる方法はわかっていますが、そのアルゴリズムを最小の不平衡ノードを見つけることに変換することはできません。私はまた、繰り返しアルゴリズムを書くのに問題があります。どんな助けもありがとう。 :)(2は、あなたのツリーはバランスがとれていないことを意味し、高さ(レベルの差を覚えている)> =)
ところで、あなたはme'ブック用のJava、 'に精通している場合*データ構造とアルゴリズムJavaで、ラフォーレ*によって私をたくさん助けましたデータ構造を理解する。それはAVLを持っていませんが、簡単に見つけられるならば、私はRed-Blackの木について広範囲に話します。一度Javaで理解すれば、あなたがよく知っている他の言語でもそれを行うことができます。全体的なポイントは彼らの仕事の仕方を理解することです。 – Carlos
@Carlos:言語が暗号ではない限り(perl ...)anyアルゴリズムまたはデータ構造の実装を実証するために行います。 –