二叉搜索树按条件删除文件节点触发段错误的排查与修复咨询
段错误成因
- 空指针访问:当
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
相关产品推荐
相关产品推荐

