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

二叉搜索树按条件删除文件节点触发段错误的排查与修复咨询

段错误成因
  • 空指针访问:当deleteNode删除当前节点后返回NULL(比如删除的是叶子节点),后续执行clear(root->left, date)时会访问NULL->left,直接触发段错误,这是程序崩溃的直接原因。
  • 递归逻辑错误:你将左右子树递归清理的返回值直接赋值给了root变量,会直接覆盖当前根节点的引用,导致左子树的清理结果被右子树完全覆盖,整棵树的结构被彻底破坏。
  • 漏删风险:如果deleteNode删除当前节点后,返回的新根节点(比如右子树的最小节点替换到当前位置)的访问日期也符合删除条件,你没有对新根做判断就直接处理子树,会导致符合条件的节点漏删。
修复方案

调整递归逻辑为后序遍历顺序,先清理左右子树,再判断当前节点是否需要删除,修改clear函数如下:

Node* clear(Node *root, int date) {
    if(root == NULL) {
        return NULL;
    }
    // 先递归清理左右子树,将结果赋值给对应的指针
    root->left = clear(root->left, date);
    root->right = clear(root->right, date);
    // 再判断当前节点是否需要删除
    if(root->info.lastAccess <= date) {
        // 删除当前节点,直接返回删除后的根节点
        return deleteNode(root, root->info.name);
    }
    // 不需要删除就返回当前节点
    return root;
}

补充注意

请确保你用到的minValueNode函数已经正确实现,如果未实现可以补充如下代码:

Node* minValueNode(Node* node) {
    Node* current = node;
    // 二叉搜索树的最小节点一定在最左子树
    while (current != NULL && current->left != NULL) {
        current = current->left;
    }
    return current;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:27:01