【发布时间】:2020-11-02 15:59:52
【问题描述】:
附上我试图在 bst 中删除节点的代码。
如果我想删除节点1,当在“if (del_node->l_ == NULL)”中指定tmp = del,并删除tmp时,del也被删除,树数据丢失。我该如何解决这个问题?
示例树:
3
/ \
1 5
\
2
-
为简单起见,所有数据成员和函数都声明为 public。
void BST::DeleteNode(int data) { BinaryTreeNode* &del_node = BST_Search(head_, data); if (!del_node->l_ && !del_node->r_) { delete del_node; del_node = nullptr; return; } if (del_node->l_ == NULL) { BinaryTreeNode* tmp = del_node; del_node = del_node->r_; tmp = nullptr; delete tmp; return; } if (del_node->r_ == NULL) { BinaryTreeNode* tmp = del_node; del_node = del_node->l_; delete tmp; return; } else { del_node->data_ = smallestRightSubTree(del_node->r_); } } int BST::smallestRightSubTree(BinaryTreeNode* rightroot) { // if rightroot has no more left childs if (rightroot && !rightroot->l_) { int tmpVal = rightroot->data_; BinaryTreeNode* tmp = rightroot; rightroot = rightroot->r_; delete tmp; return tmpVal; } return smallestRightSubTree(rightroot->l_); } int main() { BST bst; bst.BST_Insert(bst.head_, 3); bst.BST_Insert(bst.head_, 5); bst.BST_Insert(bst.head_, 1); bst.BST_Insert(bst.head_, 2); bst.DeleteNode(1); return 0; }
感谢您的帮助! 编辑:这是条件“if(del->l = null)”中的“del_node = del_node->r_)”行之后 tmp 和 del_node 的样子
void BST::BST_Insert(BinaryTreeNode*& head, int data) {
if (head == nullptr) {
head = new BinaryTreeNode(data, nullptr, nullptr);
return;
}
if (data > head->data_) {
BST_Insert(head->r_, data);
}
else {
BST_Insert(head->l_, data);
}
}
BinaryTreeNode* BST::BST_Search(BinaryTreeNode* root, int key) {
if (root == nullptr || root->data_ == key)
return root;
if (key > root->data_)
return BST_Search(root->r_, key);
return BST_Search(root->l_, key);
}
【问题讨论】:
-
tmp = nullptr; delete tmp;不释放任何内存。它只是忘记了 tmp 中指针的值。不确定“树数据丢失”是什么意思。您可能应该为此使用调试器并观察该方法的运行情况。或者做一个正确的minimal reproducible example,这样我们就可以看到问题了。或两者兼而有之。 -
感谢您的评论。去掉“tmp=nullptr”,事情是,树是按我预期的那样构造的。但是,当我在删除方法中时,“del_node”获取节点 1 的地址,“tmp”获取与 del_node 相同的内存地址。当 del_node 被提升为指向它的右子节点时,del_node 和 tmp 中的数据被删除.. (可能是错误使用了 delete 运算符?)在原始帖子中附加了调试器的屏幕截图。谢谢
-
如果在这段代码之后 del_node 指向可能是堆栈的空白,那么怀疑将落在
BST_Search没有做完全正确的事情并且您还没有向我们展示其中的内容.对minimal reproducible example 的要求不仅仅是为了给您带来不便,还有一个意义…… -
对不起!没注意。也添加了这些功能。仍在尝试了解什么不起作用.. 是不是与我删除指针的脸有关?也许因为他们拥有相同的地址,删除一个会导致另一个删除?过去两个小时我一直在调试这个,但由于某种原因,del_node 和 tmp 在“delete tmp”行之后变为空