我正在实现一个C ++二进制搜索树,并且正在尝试编写一个删除某个节点的函数。该代码适用于叶节点(无子节点)和具有一个子节点的节点,但每次尝试删除具有2个子节点的节点时,它将删除整个子树。
struct Node {
string key;
string otherdata;
Node* left;
Node* right;
};
typedef Node* bst;
以上是bst的声明结构。 以下是(部分)功能:
void delete_bst_node (bst& root, string key) {
if(...){
//...code to setup edge cases
}
else if((root->key)>key){
delete_bst_node(root->left, key);
}else if((root->key)<key){
delete_bst_node(root->right, key);
}
//and then start deleting:
else if(root->left==NULL && root->right==NULL){
delete root;
root=nullptr;
//no child case, works fine
}else if (NULL!=root->left && NULL==root->right){
Node* temp=root;
root=root->left;
delete temp;
//1 child case 1, works fine
}else if(NULL!=root->right && NULL==root->left){
Node* temp=root;
root=root->right;
delete temp;
//1 child case 2, works fine
}else{
Node* temp =find_max_of_tree(root->left);
root->key=temp->key;
delete_bst_node(root->left, temp->key);
//**here it doesn't work.**
}
}
}
当我试图测试一个2个孩子的情况时: my input tree is here
如果删除“4”,则输出为“4 8 9”,使用bst打印功能(从最小到最大打印)。
如果我删除“2”,则输出为“2 3 4 8 9”。
从这两个例子中我发现我的代码正在删除我尝试删除的任何节点的整个左子树。
在2个子项删除案例中,我尝试使用find_max_of_tree函数找到左子树中的最大节点,并将该节点的值复制到根节点(我想要删除的节点),然后删除原始节点使用递归的左树的最大节点,使用无子案例或单个子案例。
我在网上观看并阅读了一堆资源但未能找到原因。在我调试了很长一段时间后,我发现this youtube video at time 16:15并且我们的逻辑基本相同,但我的代码不起作用:(
任何帮助将不胜感激!谢谢! :d
编辑:现在我不考虑任何重复的条目