繁体   English   中英

Splay树删除

[英]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 树中的节点,请执行以下操作:

  1. 将要删除的节点展开到根节点并销毁。 这留下了两棵树,称为左树 A 和右树 B。
  2. 重组树的新根将来自 A。将 A 树的最大(最右边)节点展开到它的根。
  3. 因为 A 的新根拥有 A 中最大的键,所以它没有右孩子。 将 A 的新根的右孩子设置为 B。
  4. A是新的组合树。

这就是https://www.cs.usfca.edu/%7Egalles/visualization/SplayTree.html上的可视化所做的。

您在对另一个答案的评论中说:

所以在实践中,您选择的节点来替换已删除的节点并不重要,即影响性能等。

在典型的 splay 树删除算法中,要替换的节点将是前驱节点或后继节点,按密钥顺序排列。

经验法则是在访问特定节点时始终张开。 找到要删除的节点,然后展开到根节点。 找到它的前身,然后展开它到根。 还有一些变化,您也可以不那么激进地张开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM