0

私は 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;
}
4

0 に答える 0