2017-03-12 62 views
-3

我正在创建一个二叉搜索树的递归函数,它删除最小节点,它将是树中最左边的节点。我从根开始,从那里往下走。我试图了解为什么我会收到invalid read of size 8错误。我很确定我所在的当前节点永远不会是NULL,并且如果树是空的,我创建了一个条件。二进制搜索树valgrind错误“无效的大小为8的读取”

void removeMinimumValue() 
{ 
    removeMinimumValue(root); 
} 

void removeMinimumValue(BSTNode *node) 
{ 
    if(root==NULL) 
     exit(1); 
    else if (node->leftChild==NULL) 
     delete node; 
    else 
     removeMinimumValue(node->leftChild); 
} 
+0

欢迎堆栈溢出。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

回答

3

我想这会发生在第二次删除最小值? 第一次删除时,删除最低节点,但它的父节点仍然有一个引用(“悬挂指针”)。下一次迭代,函数将尝试读取已删除的节点。

我还想补充一点,如果最低节点有一个正确的孩子,你必须将它添加为它的父节点的左子节点。否则,你正在失去这些节点。你甚至不必检查这个节点是否有正确的子节点,因为如果它是NULL,你必须将NULL写入到被删节点的父节点的左子节点。

因此改变delete node;

node->parent->leftChild = node->rightChild; 
delete node; 
+0

好赶上.... –

+0

非常感谢!这非常有意义。我完全忘了摇晃的指针。 – whdgns0665