当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (d4)AVL树:(3+4)-重构 > 07D4-1 ”3+4“重构
实际上 以上针对AVL树
插入操作和删除操作
所介绍的单旋式和双旋式调整技巧
无非是为了帮助你形成对算法的理解
而在真正的实现时
我们大可不必机械地如此理解
这样一个过程可以比喻为玩魔方
是的 你需要在规则的允许下
通过巧妙的旋转组合
使之转入某种特定的状态
比如六面各自同色
那么你是否去过魔方的组装车间?
你会发现那里的工人
可不是按照你这样的规则
在那儿进行这样的旋转
实际上 它们无非是将魔方的
一个又一个组件直接地拼接为一个魔方
工人们之所以这么做
是因为它们最大也是唯一的目标是
尽快地以最高的效率完成魔方的组装
我们这里呢 也不妨借助这一策略
因为对于AVL树的重平衡化而言
我们最终在乎的并不是所谓的技巧
而是在于这个过程的效率
我们来看一下
如何将魔方组装工人的那种策略
用到我们这个问题上
具体来说 我们依然假设g
就是当前最低的那个失衡祖先
并且同样地沿着那个最长的分支
去考察g p v这祖孙三代
以下我们并不急于对它们进行旋转
而是首先做重命名
也就是说
按照它们在中序遍历序列中的次序
自小到大
重新命名为a b以及c
对照我们此前所讲的各种情况
无论是Zig-zag zag-zig
Zig-zig或者是zag-zag
你会发现在它们以下
无非是最多4棵子树
那么我们也需要对这4棵子树做重命名
而且命名的规则
同样是参照中序遍历的次序
也就是T0至最小的那棵树
T1是次小的 T2是较大的 T3是最大
此时 如果我们依然按照中序遍历的次序
将这两个序列混合起来
就可以得到一个长度为7的序列
在这个序列中 三个节点a b c
必然是镶嵌于这4棵子树之间
实际上 无论是哪种具体的情况
经过这样的重命名之后
按照中序遍历的次序
必然是从T0到a 再从a到T1
再从T1到b 然后从b到T2
再从T2到c 最终由c到T3
你应该不会觉得奇怪
因为这恰恰就是BST所谓的单调性
在这样一棵局部子树的具体体现
在调整之前 即便这棵子树是失衡的
它也依然是一棵BST
所以这个单调性应该自然满足
而在调整之后 尽管它已经恢复了平衡
但是这个单调性也依然需要保持
因此 我们可以统一地将这三个顶点abc
以及这4棵子树
按照这样一个拓扑关系直接地拼接起来
具体来说 以a和c
分别作为b的左和右孩子
而T0和T1将作为a的左和右子树
T2和T3分别作为c的左和右子树
这样一种拼接是针对于三个节点
以及下属4棵子树而言的
所以也称作3+4重构
在此 你不妨稍作暂停
并对照此前所介绍的各种情况
以及相应的调整算法
应该会发现 无论是插入还是删除
无论是单旋 还是双旋
最终的效果都应该是这样一种形式
这也犹如无论魔方的最初状态如何
也无论你所设计的旋转方案具体如何
最终必然应该达到
你心目中早已设计好的一个结局
对于魔方而言 一般都是六面各自同色
而对于我们的BBST而言
则是在此局部地重新平衡
按照这样的一个思路
我们可以更为概括
而且更为深入地来理解并且记忆
以上各种情况的处理手法
而更好的消息是 按照这样一种理解
我们也可以更加简明 更加高效
而且更加安全鲁棒地来实现相应的重构算法
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试