当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (c)平衡与等价 > 07C-5 等价变换
实际上 任何一对等价BST之间的相互转换
都可以视作是由一系列的
基本操作串接而成的
而这种基本的变换无非两类 彼此对称
其中一类如这个图所示
也就是说 如果节点V拥有一个左孩子C
而且它们属下分别有三棵
在此命名为X Y Z的子树
我们只需将这局部的
两个节点以及三棵子树
重新调整为这样一种拓扑连接的形式
那么无论是在此局部
还是在它们所属的那棵全树
顺序性和单调性将依然保持
也就是说 全树依然将是一棵BST
为了对此做一验证
我们不妨来考察在此局部的中序遍历次序
我们可以看到
无论是在变换之前 还是变换之后
在此局部 中序遍历序列的次序
必然是X C Y V 以及最后的Z
从效果来看 这样一个变换
可以大致理解为是在此局部围绕着节点V
做了一个顺时针的旋转
我们称这种变换为zig
那么这种旋转的中心V 则是zig的参数
右图是完全对称的另一种基本操作
因为它可以理解为是围绕着节点V
做了一次逆时针的旋转操作
我们也形象地称之为zag
在后续的章节中 我们将会看到
包括AVL树 红黑树在内的
各种BBST都分别精心地
定义了某种适度平衡的准则
从而使得原本在其中的任何一棵BBST
即便在经过某次操作之后
会暂时地游离到这个边界之外
我们也总是能够通过
一系列精巧地等价变换
令它重新回到这个边界以内
并重新成为一棵BBST
而在设计所有这些等价变换的组合时
我们始终不要忘了
应该遵循两个重要的准则
一个就是所谓的局部性
也就是说 我们执行的每一次等价变换
都应该局限在某一常数规模的局部
比如对于我们刚刚介绍的
zig和zag操作而言
它们都局限在局部的V和C两个节点处
如此它们所牵涉到的节点总数既然是常数
这类操作所需要的计算时间
也可以严格地控制在常数的规模
第二个需要严格遵守的是
在我们将一棵刚刚失衡的BBST
重新恢复为一棵BST的过程中
累计需要执行的
这样的操作的次数不要过多
比如至多不能超过logn次
这样我们就可以有效地控制
整个操作序列的长度
以及总体所需要的时间
后面我们会看到 任何一种BBST
都必须至少满足这样一个logn的基本条件
但是在进一步的要求上
它们各自又有所差异
比如对于AVL树而言
它的删除操作只能刚刚达到这个及格线
而它的插入操作却可以优化到常数
而我们在第八章中将要介绍的红黑树
也就是Red Black Tree
则可以进一步地将这两种操作的性能
同时提升到最优的常数
那么接下来的一节 我们就首先来看看
AVL树是如何达到这样一个及格线的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试