[英]Splay Tree Deletion
我无法概念化从 splay 树中删除的过程。 给定这个初始树,我想删除节点 78。
根据我的课程中的信息(来自 Goodrich、Tamassia 和 Goldwasser),BST 中删除的节点应该替换为通过执行从应该是 91 的节点开始的顺序遍历到达的下一个节点。然后这个节点应该展开到树的顶端。 但是,此处的可视化工具显示的情况并非如此。 https://www.cs.usfca.edu/~galles/visualization/SplayTree.html
可视化器将 78 替换为其前任 (70) 并展开该节点。 (有序后继,即排序后的下一个键是 83,而不是 91。)一般来说,张开的树具有极好的延展性,只要您将刚刚下降的路径的长度大约减半,同时使其他路径在大多数时间长一点,从渐近性能的角度来看,您是正确的(但是,您的教授可能有不同的想法)。
你的教科书描述:
BST 中删除的节点应该被从应该是 91 的节点执行顺序遍历到达的下一个节点替换
该描述适用于非平衡 BST(二叉搜索树),但不适用于大多数各种平衡二叉树,也不适用于 Splay 树。 要删除 splay 树中的节点,请执行以下操作:
这就是https://www.cs.usfca.edu/%7Egalles/visualization/SplayTree.html上的可视化所做的。
您在对另一个答案的评论中说:
所以在实践中,您选择的节点来替换已删除的节点并不重要,即影响性能等。
在典型的 splay 树删除算法中,要替换的节点将是前驱节点或后继节点,按密钥顺序排列。
经验法则是在访问特定节点时始终张开。 找到要删除的节点,然后展开到根节点。 找到它的前身,然后展开它到根。 还有一些变化,您也可以不那么激进地张开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.