当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (c)平衡与等价 > 07C-3 理想+适度
为了有效地控制树的高度
我们或许首先应该弄明白
什么样的树相对而言高度是更低的
我们会发现 在节点数目相对固定时
左右兄弟子树的高度越是接近
全树通常也会更加倾向于高度更低
也就是说 全树越是接近于平衡
那么它的高度也会倾向于更低
因此我们可以通过控制全树的平衡度
以控制全树的高度
关于树的高度 我们有这样一个结论
由n个节点所组成的二叉树
其高度最低不会少于log 2为底n的对数
因此如果某棵树的高度
能够达到这样一个理想的下限
我们也称之为理想平衡的
那么哪些树能够达到
这样的理想平衡状态呢?
你应该会联想起我们此前所讲过的
完全二叉树 Complete Binary Tree
是的 在这样的树中
叶节点只能出现在最底层以及次底层
当然 其中最好最好不过的
自然是所谓的满二叉树 Full Binary Tree
然而很遗憾 这样的树在实际应用中
只能是可遇不可求的
而且即便BST在某一个时刻
能够达到这样高度紧凑的形式
在接下来的动态操作过程中
这样一种完美的形式也是难以持续的
因此所谓的理想平衡
在实际应用中是不具任何意义的
是的 理想平衡出现的可能性
非常非常的低
而且为了维护这样的理想平衡
我们的计算成本也相应地会十分的高昂
相对而言 我们会得不偿失
而真正可行的方法是
我们或许应该适度地放松平衡的标准
没错 适度地放松
你或许会联想起我们此前的渐近分析
没错 那正是我们的一个法宝
实际上只要能够保证全树的高度
能够从渐近的意义而言不超过logn
那么也就可以称之为是平衡的了
因为这种平衡并非严格意义上的理想平衡
所以我们也不妨称之为适度平衡
这样一种适当的放松
但又不失原则的方法
也就是我们通常所谓的退一步海阔天空
那么相应地 能够保持适度平衡的BST
也称作平衡的二叉搜索树
Balanced Binary Search Tree
简称BBST
也就是说 如果将所有的BST
视作一个全集
那么BBST只是其中的一个子集
对于目前而言其中任何一棵BBST
如果经过某次操作之后
它不再保持适度平衡
也就是说 会游离到这个子集之外
果真如此 我们就需要有一整套方法
将这棵BST重新拉回到这个子集中
使它重新成为一棵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)希尔排序:逆序对
-本章测验
--本章测试