我正在尝试从二叉树函数中删除。我有点迷路了,所以我试图逐个处理它,首先是我要删除的值是否在 BST 的根目录中。为了测试我的函数,我首先调用 printcontents() 函数来打印树的所有内容,然后调用 remove(8) [8 是我的根目录中的值),然后调用 printcontents( ) 再次。我这样做的方式是尝试用树左侧的“最右边”值替换根。当我第二次调用 printcontents 时,它会正确打印新的根值,但是当它继续打印内容并到达该值曾经的位置时,它有一个随机长数“-572......” (虽然我不认为这个数字很重要)然后我的程序崩溃了。
这是我的删除功能:
void BinarySearchTree::remove(int value) {
Node* tmp = head;
Node* tmp2 = head;
if (head->data == value && head->left != NULL) {
tmp=tmp->left;
while (tmp->right != NULL) {
tmp=tmp->right;
}
while (tmp2->right->right != NULL) {
tmp2=tmp2->right;
}
if (tmp->left == NULL) {
head->data = tmp->data;
tmp2->right = NULL;
delete tmp;
}
if (tmp->left != NULL) {
head->data = tmp->data;
tmp2->right = tmp->left;
delete tmp;
}
}
这显然是不完整的,但我正在测试它以仅处理根被删除并被树左侧最右边的值替换的情况(假设有一个左侧),并且我觉得从逻辑上讲它应该可以工作,所以也许是当我“删除 tmp”时出现问题。我不知道是否有必要发布我的整个程序,但如果有,请告诉我!