私は C++ で AVL ツリーを実装しようとしてきましたが、1 行を除いてすべて正しくプログラムできたと思います。プログラムの構成は以下の通りです。
struct AvlNode
{
int key;
int height;
AvlNode *left;
AvlNode *right;
AvlNode(int key1, int height1 = 0, AvlNode *left1 = NULL, AvlNode *right1 = NULL)
{
key = key1;
height = height1;
left = left1;
right = right1;
}
};
class AvlTree
{
private:
AvlNode * root;
void destroySubTree(AvlNode * v);//destroy a subtree rooted at v
void displayPreOrder(AvlNode *);//pre-order traversal
void displayInOrder(AvlNode *);//in-order traversal
void displayPostOrder(AvlNode *);//post-order traversal
void remove(AvlNode * &, int);//remove
void insert(AvlNode * &, int);//insert
void balance(AvlNode * &); //make the tree balanced after each insert/remove
void rightRotate(AvlNode * &);//right rotation
void leftRotate(AvlNode * &);//left rotation
void doubleLeftRightRotate(AvlNode * &);//left right double rotation
void doubleRightLeftRotate(AvlNode * &);//right left double rotation
public:
AvlTree() { root = NULL; }
~AvlTree() { destroySubTree(root); }
AvlNode * search(int);
void displayPreOrder() { displayPreOrder(root); }
void displayInOrder() { displayInOrder(root); }
void displayPostOrder() { displayPostOrder(root); }
void insert(int x) { insert(root, x); }//insert a new key x
void remove(int x) { remove(root, x); }//remove a key x
int getHeight(AvlNode * v);//return the height of node v
int getTreeHeight() { return getHeight(root); }//return the height of the tree
int getRoot() { return root->key; }//return the root
int max(int x, int y);
};
したがって、私が抱えている問題は、次のようなバランス方法で発生します。
void AvlTree::balance(AvlNode * & v)
{
if (v == NULL)
{
return;
}
if ((getHeight(v->left) - getHeight(v->right)) > 1)
{
if (getHeight(v->left->left) >= getHeight(v->left->right))
rightRotate(v);
else
doubleLeftRightRotate(v);
}
if ((getHeight(v->right) - getHeight(v->left)) > 1)
{
if (getHeight(v->right->left) >= getHeight(v->right->right))
doubleRightLeftRotate(v);
else
leftRotate(v);
}
v->height = 1 + max(getHeight(v->left), getHeight(v->right));
}
メソッドの最後の行は、コンパイラが私を驚かせた場所です。プログラムを実行すると、Visual Studio で source.exe が動作を停止したと表示されます。試みたようにノードの高さを直接割り当てることができないためですか?そうでない場合、ここでこの問題を解決できる可能性のあるものは何ですか? バランス調整後にノードの高さを設定するさまざまな方法を試しましたが、それは単に許可されません。事前に助けてくれてありがとう!
デバッガーでプログラムを実行すると、次のように rightRotate メソッドの最初の行で停止します。
void AvlTree::rightRotate(AvlNode * & k2)
{
AvlNode * k1 = k2->left;
k2->left = k1->right;
k1->right = k2;
k2->height = 1 + max(getHeight(k2->left), getHeight(k2->right));
k1->height = 1 + max(getHeight(k1->left), k2->height);
k2 = k1;
}