【发布时间】:2018-09-05 17:23:53
【问题描述】:
我正在尝试为二叉搜索树实现递归删除算法,并已成功完成,但它破坏了排序算法(中序、前序和后序)。这是我的删除功能代码
void remove_rec(string word, Node* ptr) {
if (word < ptr->data && ptr->left != nullptr) {
remove_rec(word, ptr->left);
}
else if (word > ptr->data && ptr->right != nullptr) {
remove_rec(word, ptr->right);
}
else {
//if the node has no children
if (ptr->left == nullptr && ptr->right == nullptr) {
delete(ptr);
ptr = nullptr;
}
//if there is a right child
else if (ptr->left == nullptr && ptr->right != nullptr) {
Node* temp = ptr;
ptr = ptr->right;
delete temp;
}
//if there is a left child
else if (ptr->left != nullptr && ptr->right == nullptr) {
Node* temp = ptr;
ptr = ptr->left;
delete temp;
}
}
}
当递归调用中序(或任何其他排序方法)并且左右节点为空时,程序似乎崩溃了。程序没有跳过该 if 语句,而是继续尝试访问左节点,直到它因错误“读取访问冲突”而崩溃。如果我不调用 remove_rec 函数,排序函数将按预期工作。对我来说,似乎在删除节点后我没有正确构建树。任何帮助深表感谢!如果没有调用该函数,我只包含了我认为导致问题的代码,一切都按预期工作。
【问题讨论】:
-
恢复到刚刚删除的节点上方的树的链接所需的父链接在哪里?如果您只是删除左右为 nullptr 的叶节点,该代码“可能”会正常工作
-
如果两个孩子都不为 null 并且 word 等于数据怎么办?我认为这是破坏你的算法的原因
标签: c++ recursion binary-search-tree