Splay Tree(伸展树)删除节点操作疑问:删除78结果与教程不符
伸展树删除结果差异的原因
你遇到的结果不一致问题,核心是伸展树存在两种主流的删除实现策略,你所学的教材和USFCA可视化工具分别采用了不同的方案:
- 第一种是Goodrich、Tamassia和Goldwasser教材采用的「后继替换+伸展」方案
操作逻辑为:找到待删除节点后,用该节点的中序后继(你案例中就是值为91的节点)替换待删除节点的位置,最后将替换用的后继节点伸展到整棵树的根节点。 - 第二种是USFCA可视化工具采用的Sleator&Tarjan原始经典删除方案
操作逻辑为:先将待删除节点伸展到整棵树的根节点,直接删除根节点后,原树会拆分为互不相交的左子树(所有节点值小于被删除节点值)和右子树(所有节点值大于被删除节点值)。如果左子树非空,就将左子树的最大值节点伸展为左子树的根,再将右子树挂载为这个左子树新根的右孩子;如果左子树为空,直接以右子树作为删除后的新树。
两种方案都是符合伸展树定义的合法实现,只是设计思路的区别:教材方案更贴近通用二叉搜索树的删除逻辑,方便学习者理解;原始论文方案的实现不需要额外处理节点替换的指针关联,代码实现更简洁,且伸展操作的触发时机更早。
内容的提问来源于stack exchange,提问作者flying_loaf_3
相关产品推荐
相关产品推荐

