【发布时间】:2018-11-16 01:16:54
【问题描述】:
我正在测试从二叉搜索树中删除节点的函数,但发现我无法删除叶节点。在打印整个树时,Visual Studio 在 in_order 函数中给了我这个错误。 - 抛出异常:读取访问冲突。 树是 0xDDDDDDDD。
想知道如何修复它,因为到目前为止它在所有其他情况下都有效。
void in_order(BinTreeNode* tree) {
if (tree->left != NULL)
in_order(tree->left);
std::cout << tree->value << std::endl;
if (tree->right != NULL)
in_order(tree->right);
}
void deleteNodeFromBST(BinTreeNode* root_value, int key_value)
{
BinTreeNode* selected_node = root_value;
BinTreeNode* previous_selected_node = NULL;
bool foundNode = false;
/* find the node we want to delete */
while (foundNode == false)
{
if (selected_node == NULL)
{
return;
}
else
{
if (selected_node->value == key_value)
{
foundNode = true;
}
else
{
previous_selected_node = selected_node;
if (key_value > selected_node->value)
selected_node = selected_node->right;
else
selected_node = selected_node->left;
}
}
}
if (foundNode == false)
{
return;
}
/* if the node has no children, just delete it */
if (selected_node->left == NULL && selected_node->right == NULL)
{
if (previous_selected_node->left == selected_node)
previous_selected_node->left == NULL;
else
previous_selected_node->right = NULL;
delete selected_node;
return;
}
/* if the node has one child to the left , we replace the node with the child*/
else if (selected_node->left != NULL && selected_node->right == NULL)
{
if (previous_selected_node->left == selected_node)
{
previous_selected_node->left = selected_node->left;
delete selected_node;
selected_node = NULL;
return;
}
else
{
previous_selected_node->right = selected_node->left;
delete selected_node;
selected_node = NULL;
return;
}
}
/* if the node has one child to the right, we replace the node with the child*/
else if (selected_node->right != NULL && selected_node->left == NULL)
{
if (previous_selected_node->right == selected_node)
{
previous_selected_node->right = selected_node->right;
delete selected_node;
selected_node = NULL;
return;
}
else
{
previous_selected_node->left = selected_node->right;
delete selected_node;
selected_node = NULL;
return;
}
}
/*if the node we want to delete has two children, we find the max value in the left subtree and we replace it */
else if (selected_node->left != NULL && selected_node->right != NULL)
{
BinTreeNode* maxLeftValue = selected_node->left;
BinTreeNode* maxLeftValuePrev = selected_node;
while (maxLeftValue->right != NULL)
{
maxLeftValuePrev = maxLeftValue;
maxLeftValue = maxLeftValue->right;
}
selected_node->value = maxLeftValue->value;
if (maxLeftValue->left != NULL)
{
maxLeftValuePrev->right = maxLeftValue->left;
}
else
{
maxLeftValuePrev = NULL;
}
delete maxLeftValue;
maxLeftValue = NULL;
return;
}
}
int main(int argc, char *argv[])
{
//BinTreeNode* t = tree_insert(0, 6);
/*tree_insert(t, 10);
tree_insert(t, 5);
tree_insert(t, 2);
tree_insert(t, 3);
tree_insert(t, 4);
tree_insert(t, 11);*/
BinTreeNode* t = tree_insert(0, 20);
tree_insert(t, 15);
tree_insert(t, 19);
tree_insert(t, 11);
tree_insert(t, 13);
tree_insert(t, 9);
tree_insert(t, 12);
tree_insert(t, 5);
tree_insert(t, 2);
tree_insert(t, 3);
deleteNodeFromBST(t, 16);
deleteNodeFromBST(t, 19);
deleteNodeFromBST(t, 13);
deleteNodeFromBST(t, 11);
in_order(t);
return 0;
}
【问题讨论】:
-
Visual Studio -- 这包括业内最好的调试器之一。为什么不使用它来解决您的问题?
标签: c++ visual-studio function binary-tree binary-search-tree