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
相关产品推荐
相关产品推荐

