BST删除方法无法删除首个插入节点问题求助
分析并解决二叉搜索树根节点删除无效的问题
嘿,我一眼就看出问题出在哪了——你的公共delete方法没有正确更新根节点的引用!
核心问题所在
你现在的公共删除方法是这样的:
public void delete(KeyComp key) { delete(_root, key); }
Java是值传递,递归调用delete(_root, key)时,传递的是_root的副本。当你删除的是根节点时,递归方法内部虽然会处理根节点的替换逻辑(比如用后继节点替代),但这个新的根节点只是递归方法里的局部变量,根本没赋值回类成员_root!所以原来的根节点还留在原地,看起来删除操作毫无效果。
而删除其他节点时,因为递归过程中会更新父节点对子节点的引用,所以那些节点能被正常删除,只有根节点的引用没被更新才会出问题。
快速修复方案
把你的公共delete方法改成这样,让递归返回的新根节点赋值给_root:
public void delete(KeyComp key) { _root = delete(_root, key); }
额外验证点
还要确保你的递归delete方法逻辑是正确的,它需要在处理完节点后返回更新后的子树根节点:
- 如果目标节点是叶子节点,返回
null(让父节点的对应子节点引用变为null) - 如果目标节点只有一个子节点,返回这个子节点(让父节点直接指向这个子节点)
- 如果目标节点有两个子节点,找到它的后继(右子树最小节点)或者前驱(左子树最大节点),替换当前节点的值,然后递归删除那个后继/前驱节点,最后返回当前节点
这样整个递归过程才能正确传递更新后的节点引用,不管是删除根节点还是其他节点都能正常工作了。
内容的提问来源于stack exchange,提问作者Collin Thompson
相关产品推荐
相关产品推荐

