教育目的で AVL ツリーを実装しようとしていますが、期待どおりにローテーションが機能しません。
それぞれが左、右、および親ノードへのポインターを持つノードがあります。
以下は、右から右への回転のコードです。まず、インプット(明確にするために、これがRRケースであると私が理解していることです)
a
\
b
\
c
ローテーションを行うコードは
if (subTreeRoot == root) {
this->root=subTreeRoot->right;
}
else { // not resetting at root
subTreeRoot->right->myParent = subTreeRoot->myParent;
subTreeRoot->myParent->right = subTreeRoot->right;
}
subTreeRoot->right->left = subTreeRoot;
subTreeRoot->right = NULL;
subTreeRoot->height = 1;
return;
これは実際に機能します。a がルートでない場合でも機能します。
失敗しているテストケースは dcbae のようなものです
この場合、回転させてから、何か他のものを差し込んでいきます。
帰って見ようと思った
http://www.cse.ohio-state.edu/~sgomori/570/avlrotations.html
しかし、最初に、かろうじて外れたり、遠く離れたりしていないことを確認したかったのです。