我是C ++的新手,并且一直在尝试编写代码。我试图在avl树上实现删除操作。我在树上的插入操作工作正常,但我的删除操作遇到错误。如果有人能帮助我解决错误,我将不胜感激。
错误如下:
hw04.exe中0x00BDED43处的第一次机会异常:0xC0000005:访问冲突读取位置0x00000000。当我的代码中的代码点击bf函数时,我收到以下错误,它返回右子树的高度差 - 左子树的高度。
以下是我的代码:
int AVLTree::height(IAVLTreeNode*curr)
{
if (curr == NULL)
{
return 0;
}
int left_height = height(curr->getLeft());
int right_height = height(curr->getRight());
if (left_height > right_height){
return left_height + 1;
}
else {
return right_height + 1;
}
}
int AVLTree::bf(IAVLTreeNode*p)
{
return (height(((AVLTreeNode*)p)->getRight()) - height((AVLTreeNode*)p->getLeft()));
}
IAVLTreeNode*AVLTree::balance(IAVLTreeNode*p)
{
if (bf(p) == 2)
{
if (bf(p->getRight() )< 0)
p->setRight(rotateright((AVLTreeNode*)p->getRight()));
return rotateleft(p);
}
if (bf(p)==-2)
{
if (bf(p->getLeft())>0)
p->setLeft(rotateleft((AVLTreeNode*)p->getLeft()));
return rotateright(p);
}
return p; }
IAVLTreeNode* AVLTree::rotateright(IAVLTreeNode*p)
{
AVLTreeNode*q =(AVLTreeNode*) p->getLeft();
p->setLeft(q->getRight());
q->setRight(p);
return q;
}
IAVLTreeNode* AVLTree::rotateleft(IAVLTreeNode*q)
{
AVLTreeNode*p =(AVLTreeNode*) q->getRight();
q->setRight(p->getLeft());
p->setLeft(q);
return p;
}
IAVLTreeNode* AVLTree::getRoot()
{
return root;
}
void AVLTree::remove(int key)
{
root = remove_fn(root, key);
};
IAVLTreeNode* AVLTree::remove_fn(IAVLTreeNode*p, int key)
{
if (p == NULL)
return p;
if (key < p->getKey())
p->setLeft(remove_fn(p->getLeft(), key));
else if (key>p->getKey())
p->setRight(remove_fn(p->getRight(), key));
else
{
if ((p->getLeft() == NULL) || (p->getRight() == NULL))
{
IAVLTreeNode* temp = p->getLeft() ? p->getLeft() : p->getRight();
if (temp == NULL)
{
temp = root;
root = NULL;
}
else
*root = *temp;
delete(temp);
}
else
{
IAVLTreeNode* q = minkey(p->getRight());
p->setKey(q->getKey());
p->setRight(remove_fn(p->getRight(), q->getKey()));
}
}
height(root);
root = balance(root);
}
IAVLTreeNode * AVLTree::minkey (IAVLTreeNode*h)
{
IAVLTreeNode* tmp;
while (tmp->getLeft() != NULL)
tmp = tmp->getLeft();
return tmp;
}
答案 0 :(得分:0)
您的bf
应为left - right