【问题标题】:Delete operation in a binary search tree not working correctly二叉搜索树中的删除操作无法正常工作
【发布时间】:2022-01-21 08:22:53
【问题描述】:

我正在尝试在二叉搜索树中实现删除功能。我知道这三个步骤是:

  1. 识别要删除的节点和最深的节点。

  2. 用最深节点的数据替换其数据。

  3. 删除最深的节点。

我尝试这样实现,但删除不起作用

我的尝试有什么问题,我该如何解决?

TREE *delete(TREE *t,int d) {
    TREE *temp=NULL;
    if(t==NULL)
        return NULL;
    else if(d>t->data)
        return delete(t->right,d);
    else if(d<t->data)
        return delete(t->left,d);
    else {
        if(t->right && t->left) {
            temp=min(t->right);
            t->data=temp->data;
            return delete(t->right,t->data);
        }
        else {
            temp=t;
            if(t->left==NULL)
                t=t->right;
            else if(t->right==NULL)
                t=t->left;
            free(temp);
        }
        return t;
    }
}

【问题讨论】:

标签: c binary-search-tree


【解决方案1】:

问题是当你递归调用delete 时,你返回它的返回值。这是不正确的。

当使用第一个参数t-&gt;right 调用delete 时,返回的节点就是t-&gt;right 应该成为的节点。所以这个值必须分配t-&gt;right。在分配之后,t 应该被返回。

代码中有三行用于进行递归调用。它们都应该按照上面的说明进行修改。并且return t 语句应移出else 块,以便针对所有相关情况执行。

TREE *delete(TREE *t, int d) {
    TREE *temp = NULL;
    if (t == NULL)
        return NULL;
    else if (d > t->data)
        t->right = delete(t->right, d); // Assign the return value
    else if (d < t->data)
        t->left = delete(t->left, d); // ...
    else {
        if (t->right && t->left) {
            temp = min(t->right);
            t->data = temp->data;
            t->right = delete(t->right, t->data); // ...
        }
        else {
            temp = t;
            if (t->left == NULL)
                t = t->right;
            else // No need to have an IF here.
                t = t->left;
            free(temp);
        }
    }
    return t; // Moved here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多