名字不能取太长 2022-08-31 12:25 采纳率: 75.6%
浏览 94
已结题

二叉搜索树删除结点代码存在问题

以下是我的二叉搜索树的删除结点函数,无法正确删除结点,请问bug在哪里?如何解决

typedef struct _TreeNode
{
    //结点结构体
    int data;
    struct _TreeNode* lchild;
    struct _TreeNode* rchild;
}TreeNode, *PTreeNode;

void delete_node(PTreeNode* root, int data)
{
    //删除结点
    PTreeNode* p = root;
    PTreeNode* f = NULL;
    PTreeNode* q = NULL;
    PTreeNode* s = NULL;
    if (!*root)
    {
        return;
    }
    while (*p)
    {
        if ((*p)->data == data)
        {
            break;
        }
        f = p;
        if ((*p)->data > data)
        {
            p = &((*p)->lchild);
        }
        else
        {
            p = &((*p)->rchild);
        }
    }
    if (*p == NULL)
    {
        return;
    }
    if (((*p)->lchild) && ((*p)->rchild))
    {
        //左右结点都非空
        q = p;
        s = &((*p)->lchild);
        while((*s)->rchild)
        {
            //遍历p的前驱结点
            q = s;
            s = &((*s)->rchild);
        }
        (*p)->data = (*s)->data;
        if (q != p)
        {
            (*q)->rchild = (*s)->lchild;
        }
        else
        {
            (*q)->lchild = (*s)->lchild;
        }
        free(*s);
    }
    else
    {
        if (!(*p)->rchild)
        {
            //右子树无结点
            q = p;
            p = &((*p)->lchild);
        }
        else if (!(*p)->lchild)
        {
            //左子树无结点
            q = p;
            p = &((*p)->rchild);
        }
        if (!*f)
        {
            root = p;
        }
        else if (q == &((*f)->lchild))
        {
            (*f)->lchild = *p;
        }
        else
        {
            (*f)->rchild =*p;
        }
        free(*q);
    }
}

运行结果:

img


测试用例1 5 6 8 0,删除完只输出1,其他函数均无问题

  • 写回答

4条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-08-31 13:08
    关注
    看下这篇博客,也许你就懂了,链接:二叉搜索树详解(附代码)
    评论

报告相同问题?

问题事件

  • 系统已结题 9月8日
  • 创建了问题 8月31日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价