C语言二叉树删除节点后中序遍历无限递归触发段错误问题求解
问题排查及修复方案
核心故障成因
你遇到的无限递归+段错误是双孩子节点删除逻辑的遗漏赋值导致的野指针问题:
- 处理待删除节点有2个孩子的分支时,调用
DeleteNode(root->Left, max)删除左子树的最大值节点后,没有将返回的新左子树指针赋值给root->Left,导致root->Left仍然指向已经被free释放的内存空间。 - 被释放的内存值是不可预测的,大概率不会为
NULL,中序遍历时就会把这块野地址当成有效节点指针递归访问,最终要么无限递归爆栈,要么访问非法地址触发段错误。
其他存在的隐患问题
insertNode函数声明为返回struct Node*类型,但除了根节点为空的分支外,其余分支都没有写return root,会产生未定义行为,部分编译器下可能返回非法指针。- 主函数中调用
DeleteNode时建议接收返回值,避免删除根节点时根指针失效的问题。
修复代码修改点
- 修复双孩子删除逻辑的赋值遗漏:
else{ int max = getMax(root->Left); root->data = max; // 原代码仅调用DeleteNode,没有赋值给root->Left root->Left = DeleteNode(root->Left, max); return root; }
- 为
insertNode函数补充返回值:
在insertNode的最后添加return root;即可。 - 主函数中修改DeleteNode调用方式:
// 原代码:DeleteNode(root, 10); root = DeleteNode(root, 10);
修复后验证
修改完成后删除10节点的逻辑会正常执行:原来值为10的节点先被替换为左子树最大值7,再删除原来的7节点,对应父节点的Left指针被置为NULL,中序遍历可以正常输出3 5 7 14 16,不会再出现递归溢出或段错误。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

