我在删除节点后尝试显示树时出现内存错误。
这是我的删除(删除)方法:
void binarySearchTree::remove(int x, node * r)
{
bool found = false;
node * previous = NULL;
if (root == NULL)
{cout << "Tree is empty. Nothing to remove." << endl; return;}
while (!found)
{
if (x < r->data)
{
previous = r;
r = r->left;
}
else if (x > r->data)
{
previous = r;
r = r->right;
}
else
found = true;
}
if (r->left == NULL && r->right == NULL) //case 1: node to be deleted is a leaf (no children)
{
delete r;
return;
}
else if(r->left == NULL && r->right != NULL) //case 2: node only has a right child
previous->right = r->right;
else if (r->left != NULL && r->right == NULL) //case 2: node only has a left child
previous->left = r->left;
else
{ //case 3: node has two children
node * minNode = findMinNode(r->right); //finds min node in the right sub tree
r->data = minNode->data;
delete minNode;
return;
}
delete r;
}
我的findMinNode方法:
binarySearchTree::node * & binarySearchTree::findMinNode(node * r)
{
if (r == NULL) //if tree is empty
return r;
if (r->left == NULL && r->right == NULL)
return r;
else if (r->left != NULL)
return findMinNode(r->left);
else
return findMinNode(r->right);
}
我的显示方法(使用前序遍历):
void binarySearchTree::display(node * r)
{
if (r == NULL)
return;
display(r->left);
cout << r->data << endl;
display(r->right);
}
我正在使用公开display()
方法,然后调用此私有display(node * r)
方法。
我知道问题出在我使用delete
时,因为当我逐步完成代码并使用display()
方法时,当它检查节点上是否r== NULL
时我只是已删除,地址不是NULL
,地址为0x000000000
,而是0x000000001
。因此,我的程序会崩溃。我以前从未遇到过这个问题。任何帮助将不胜感激。
我应该补充一点,我按照这个确切的顺序插入这些值:10,5,34,2,8,12,25,6,18,27,38,11。我试图删除值为12的节点因为它有两个孩子。
答案 0 :(得分:1)
当您删除节点时,您需要将指向它的指针清空,在您的示例中可以是root,previous-&gt; left或previous-&gt; right。如果您将之前的内容更改为<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.2/js/foundation.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.2/js/foundation/foundation.orbit.min.js"></script>
<script src="script.js"></script> <!-- Add -->
并将其指向上一个指针(初始化为&amp; root),则可以说node **
或*previous = null
。