下面的代码让我感到很困惑。
类
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似乎在本地交换,但它并不反映代码的其余部分的变化。给我一个无限循环。
答案 0 :(得分:2)
如果n
在进入函数时为空,那么该行将尝试取消引用它,从而产生错误。您分配新节点的代码应该将其分配给n
本身,而不是使用与阴影函数参数相同名称的单独变量。
从
更改if (n == NULL)
块的第一行
AVLNode *n = new AVLNode;
到
n = new AVLNode;
关于更新:在你的旋转函数中,n
是一个本地(自动)变量,并且更改它不会影响函数之外的任何内容。您需要通过引用传递指针,或者返回新的指针值(就像在insert()
中一样)。