[英]How do I delete a node from a binary search tree
如何实现从二进制搜索树中删除节点的功能? 下面是我当前的功能:
void makeDeletion(TreeNode *&tree) {
TreeNode *NodeToDelete;
NodeToDelete = tree;
TreeNode *InOrder;
if (tree->right == NULL && tree->left == NULL) {
delete NodeToDelete;
}
if (tree->right == NULL) {
tree = tree->left;
delete NodeToDelete;
}
else if (tree->left == NULL) {
tree = tree->right;
delete NodeToDelete;
}
else {
InOrder = tree->right;
while (InOrder->left != NULL) {
InOrder = InOrder->left;
}
NodeToDelete->value = InOrder->value;
remove(InOrder, InOrder->value);
}
}
这是我具有的remove
功能,用于定位要删除的值:
void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
if (tree == NULL){
return;
}
if (tree->value == num) {
makeDeletion(tree);
} else if (num < tree->value) {
remove(tree->left, num);
} else {
remove(tree->right, num);
}
};//Remove
就目前而言,我感觉自己已经很接近了,但是当我输出二进制树的内容时,程序崩溃了。 我正在尝试使用一种方法,如果该节点有两个孩子,则找到顺序继承者,交换顺序继承者和要“删除”的节点的节点值,然后删除顺序继承者。 如果不调整remove
函数,那么使makeDeletion
函数如所描述的makeDeletion
工作,我会丢失什么信息?
编辑:在makeDeletion
函数中,我错误地连续写了两个if
语句。 第二个if
语句应该是else if
语句。
在makeDeletion
,如果tree
是叶(包括left
和right
是NULL
),你删除叶节点,并且不设置tree = nullptr
。 这会将悬空的引用留在树中,以释放已释放的内存。 另外,然后在下一个if
取消引用(现在已删除)节点。 其中任何一种都可能导致崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.