从二叉搜索树中删除

Removing from a Binary Search Tree

本文关键字:删除 搜索树      更新时间:2023-10-16

我正在尝试从二叉树函数中删除。我有点迷茫,所以我正在尝试逐案处理它,从我尝试删除的值是否在 BST 的根目录中开始。为了测试我的函数,我首先调用一个打印树所有内容的 printcontent() 函数,然后调用 remove(8) [8 是目前根中的值),然后再次调用 printcontent()。我这样做的方法是尝试用树左侧的"最右侧"值替换根。当我第二次调用 printcontent 时,它会正确打印新的根值,但是当它继续打印内容并达到该值曾经所在的点时,它有一个随机的长数"-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"时出现问题。我不知道是否有必要发布我的整个程序,但如果有必要,请告诉我!

我可以建议,与其写出root,不如像CLRS中处理的那样对待这种情况:这是两种不同的情况。1. 当要删除的节点是叶子时2. 当要删除的节点是非叶节点时(在这种情况下,将其替换为无序的后继/前置节点)。

根删除显然属于第二种情况。这只是一个建议。