You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言二叉树删除节点递归函数改为void类型的实现逻辑咨询

实现思路

原返回struct treeNode*的版本核心逻辑是将修改后的子树根节点返回给上层,完成父节点左/右指针的赋值。改为void返回类型时,通过二级指针可以直接修改上层父节点的左/右指针变量,不需要通过返回值传递修改结果,原逻辑中所有return对应的操作都可以转换为直接修改*root的指向。

完整实现代码

void removeElement(struct treeNode **root, int data)
{
    // 空节点直接返回,原有处理逻辑正确
    if(*root == NULL)
        return;
    if (data > (*root)->data)
         removeElement(&(*root)->right, data);
    else if(data < (*root)->data)
        removeElement(&(*root)->left, data);
    else
    {
        // 情况1:待删除节点是叶子节点,左右子节点都为空
        if((*root)->left == NULL && (*root)->right == NULL)
        {
            free(*root);
            *root = NULL; // 直接修改上层对应指针为NULL
        }
        // 情况2:待删除节点只有一个子节点(你询问的分支)
        else if((*root)->left == NULL || (*root)->right == NULL)
        {
            struct treeNode *temp;
            // 保存存在的那一个子节点指针
            if((*root)->left == NULL)
                temp = (*root)->right;
            else
                temp = (*root)->left;
            free(*root); // 释放待删除节点的内存
            *root = temp; // 直接修改上层对应指针指向子节点,完成替换
        }
        // 情况3:待删除节点左右子节点都存在
        else
        {
            struct treeNode *temp = find_minimum((*root)->right);
            (*root)->data = temp->data;
            // 递归删除右子树中的重复最小节点
            removeElement(&(*root)->right, temp->data);
        }
    }
}

单孩子节点分支逻辑说明

你询问的分支核心是替代原代码中return temp的逻辑:

  • 先拿到待替换的子节点指针存到temp
  • 释放当前待删除节点的内存
  • 直接修改*root的指向为temp,因为*root本质就是上层父节点的左/右指针变量的地址解引用,修改后上层指针会直接指向新的子节点,不需要通过返回值传递结果。

调用该函数时需要传入根节点指针的地址,示例调用方式:removeElement(&root, 要删除的目标值);

内容的提问来源于stack exchange,提问作者Darke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 12:15:02