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

C语言清空二叉搜索树困惑:free后root为何仍非空?

二叉搜索树清空后指针未置空的问题分析与修复

问题根源

你遇到的问题本质是C语言的参数传递为值传递:

  • BST_To_Empty函数接收的root是main函数中root指针的副本,函数内对这个副本的修改不会影响原指针。
  • 你调用free(root)只是释放了指针指向的内存空间,但main里的原root指针仍然保存着原来的内存地址(此时该地址属于野指针,但不等于NULL),所以CheckEmpty会输出"Not NULL"。

修复方案(保持返回值为void)

要修改main函数中的原指针,需要通过**二级指针(指针的指针)**传递参数,让函数能直接操作原指针的地址:

修改后的BST_To_Empty函数

void BST_To_Empty(Node** root)
{
    if(*root)
    {
        // 递归清空左右子树,传入子节点指针的地址
        BST_To_Empty(&(*root)->l_child);
        BST_To_Empty(&(*root)->r_child);
        // 释放当前节点内存
        free(*root);
        // 将原指针置为NULL,这会直接修改main中的root变量
        *root = NULL;
    }
    printf("[BST_To_Empty] Now BST is NULL\n");
}

修改main函数的调用方式

将原来的BST_To_Empty(root);改为:

BST_To_Empty(&root);

额外修正:函数名拼写一致

注意你定义的函数是isEmpty,但main里调用的是CheckEmpty,需要统一函数名,避免编译错误。

效果验证

修改后,BST_To_Empty会在释放内存后将main中的root指针置为NULL,调用isEmpty(root)时会正确输出"NULL",符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:13:28