AVL Tree奇怪的行为

时间:2011-03-05 20:49:08

标签: c++ avl-tree

下面的代码让我感到很困惑。

class AVLTree {
   private:
struct AVLNode
{
    AVLNode *leftchild;
    AVLNode *rightchild;
    int data;
    int height;
};

AVLNode *root;

public:

AVLTree()
{
    root = NULL;
}

bool isEmpty() const { return root == NULL; }
void print();
void inorder(AVLNode *n, int l);
void insert(int d);
void rotateLeft(AVLNode* n);
void rotateRight(AVLNode* n);
void rotateLeftTwice(AVLNode* n);
void rotateRightTwice(AVLNode* n);
AVLTree::AVLNode* insert(int d, AVLNode* n);
int max( int a, int b);
int height( AVLNode* n); };

插入功能。

  AVLTree::AVLNode* AVLTree::insert(int d,AVLNode *n){
    if (n == NULL)
    {
        AVLNode *n = new AVLNode;
        n->data = d;
        n->leftchild = NULL;
        n->rightchild = NULL;
        n->height = 0;
    } else if( d < n->data) {
        n->leftchild = insert(d,n->leftchild);

    } else if (d > n->data) {
        n->rightchild = insert(d,n->rightchild);
    }
    else {      
        n->height = max(height(n->leftchild), height(n->rightchild));
        return n;
         }
        -----> This section of the code gives be "EXC_BAD_ACCESS".
    n->height = max(height(n->leftchild), height(n->rightchild));
       return n;
}

这是身高函数。

int AVLTree::height(AVLNode* node)
{   cout << "HEIGHT"; 
    if(node == NULL)
    {
        return -1;
    }
    else {
        return node->height;
    }
}

任何人都知道为什么?

===更新:

进行旋转时

 void AVLTree::rotateLeft(AVLNode* n)
    {
            AVLNode *child = n->leftchild;
            n->leftchild = child->rightchild;
            child->rightchild = n;

            n->height = max(height(n->leftchild),height(n->rightchild))+1;
            child->height = max(height(child->leftchild),height(child->rightchild))+1;
            n = child;
}

似乎没有应该交换价值。虽然n = child似乎在本地交换,但它并不反映代码的其余部分的变化。给我一个无限循环。

1 个答案:

答案 0 :(得分:2)

如果n在进入函数时为空,那么该行将尝试取消引用它,从而产生错误。您分配新节点的代码应该将其分配给n本身,而不是使用与阴影函数参数相同名称的单独变量。

更改if (n == NULL)块的第一行
AVLNode *n = new AVLNode;

n = new AVLNode;

关于更新:在你的旋转函数中,n是一个本地(自动)变量,并且更改它不会影响函数之外的任何内容。您需要通过引用传递指针,或者返回新的指针值(就像在insert()中一样)。