当前课程知识点:数据结构(下) > 第八章 高级搜索树(上) > (a3)伸展树:算法实现 > 08A3-6 删除算法
再来考察节点删除算法
同样的 按照直观的思维
我们或许会首先按照BST的标准删除算法实施删除
再按照伸展树的约定
将与之临近的节点 比如_hot伸展到树根的位置
同样的 这种方法本来也无可厚非
但是在此时 也依然显得有些迂回
这背后的原因也是类似的
因为不失一般性 如果在删除操作之前的search操作是成功的
那么在查找之后 待删除的目标节点
必然已经被推送到了树根的位置
既然如此 我们为何不随即就在树根的位置附近
来完成这样一次删除操作呢
具体的过程如下面这一组图所示
同样的 我们也需要经过一次查找
对待删除的节点进行定位
而且不失一般性 不妨假设成功
于是在紧随其后集成在search接口内的伸展操作之后
这个待删除的节点自然也就会被伸展并推送到树根
接下来呢 既然他就是待删除的元素
我们不妨将这个节点释放
于是从逻辑上看
这个节点此前的左右子树就变得彼此分离
剩下的任务是 如何将他们重新合并起来
这里有很多种方法
比如可以在右子树中找到一个最小的节点
如果你一时还想不起如何才能找到这个节点
那么我的建议是 你不妨回过头看一看
此前所介绍的中序遍历算法迭代版
好 关于这样一个节点
我们不难发现 尽管它是右子树中的最小者
相对于左子树来说 它却应该是最大者
因此接下来 只要将原先的左子树
作为这个节点的左子树连接上去
就不仅可以完成拓扑结构上的连接
而且能保持所有元素的中序遍历次序
也就是说我们顺利的将他们合二为一了
而这样一个过程的整体效果呢 同样是我们所期望的
具体来说 所需要的删除的节点 确实被删除了
而且在此之后 作为树根的节点
是一个与此前那个节点非常临近的一个
也就是说 在此后局部性将可以继续得到充分的利用
限于时间关系
伸展树插入删除算法的详细细节
在此都予忽略了
你可以在课后 打开我们的教材以及讲义
对照其上的源代码和注释
参照刚才我们所介绍的原理及过程
自行推敲和体会
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试