AVL Trees 学习笔记
2016-05-26 12:19
465 查看
AVL Trees 学习笔记
AVL Trees 是一种特殊的二叉搜索树,它的作用是通过自我调整,让整棵树保持平衡,从而降低整棵树的高度,以提高查找效率。本文将首先介绍AVL Trees,然后介绍它的实现方法,性能评估,最后分析题目。
Introduction
特点
通过自我调整使树趋于平衡,降低树的高度,提高搜索效率本质
二叉搜索树变化
相比于二叉搜索树,有两个变化,一是每个节点增加了BF属性用于存储左子树和右子树的高度差,二是每次增加或删除节点后都会进行调整,使之balance实现
结构
增加了BF属性的二叉搜索树typedef struct node* tree; struct node{ element key; tree left; tree right; int BF; }
BF = height of left tree - height of right tree
通过判断每个节点的BF值判断树是否height balanced. 若失去平衡,则开始调整。
Height Balanced
An empty binary tree is height balanced. If T is a nonempty binary tree with TL and TR as its left and right subtrees, then T is height balanced iff
(1) TL and TR are height balanced, and
(2) | hL - hR | < 1 where hL and hR are the heights of TL and TR , respectively.
调整触发条件
更新BF值从增加或删除节点的位置开始向上遍历,访问BF值
若有BF< -1 || BF > 1 调整该节点及其子树
若一直到根节点BF都正常则无需调整
调整完成,更新BF值
调整
共有 RR, LL, RL, LR 四种情况RR
需要注意的是,矩形(如BL,BR, AL)表示的不是一个节点,而是表示一棵子树,A表示的不一定是root,而是一个Trouble Maker节点。
LL
LL情况与RR相似,它们是对称的。它们的共同点是,都是在从 Trouble Maker节点 到 其子节点 到 子节点的子树 这条路径上,旋转一次。LR
LR和RL的情况就要稍微复杂,需要进行两次旋转。这次旋转中事实上包括了两次旋转,首先是B, C, C的子树路径上进行一次左旋转:
然后是A, C, B路径上的第二次旋转:
RL
RL的情况与LR情况相似性能评估
每次操作需要遍历从最底端到root的各个节点,时间复杂度为O(h),调整操作时间复杂度为O(1)。故每次操作时间复杂度为O(h)。又 h = O(lnN)
故操作时间复杂度为O(lnN)
证明 h = O(lnN)
记一个高度为h的树,节点数为nh
一棵高度为h,节点数最少的树是这样的形式:
由此我们可以得出nh = nh-1 + nh-2 + 1
令Fi = nh + 1
有Fi = Fi-1 + Fi-2
我们可以发现 Fi 符合斐波那契数列,且通过将h=1, h=2, h=3 代入,我们可以得出i = h+2
即 nh+2 - 1 符合斐波那契数列
根据斐波那契数列的理论 Fi=15√(1+5√2)i
我们可以得到 nh=15√(1+5√2)h+2−1
故 h=O(lnN)
分析题目
Insert 2, 1, 4, 5, 9, 3, 6, 7 into an initially empty AVL tree. Which one of the following statements is FALSE? (1分)A. 4 is the root
B. 2 and 6 are siblings
C. 3 and 7 are siblings
D. 9 is the parent of 7
让我们来模拟插入的过程
故答案为C
If the depth of an AVL tree is 6 (the depth of an empty tree is defined to be -1), then the minimum possible number of nodes in this tree is: (1分)
A. 13
B. 17
C. 20
D. 33
在证明h=O(lnN)的过程部分我们有
n最少时,nh = nh-1 + nh-2 + 1
又 depth = height - 1
故ndepth=6 = n7 = 33
答案为 D
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- AVL树-自平衡二叉查找树(Java实现)
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- WordPress中用于获取搜索表单的PHP函数使用解析
- JavaScript中数组的排序、乱序和搜索实现代码
- jquery ztree实现树的搜索功能
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- iOS应用中UISearchDisplayController搜索效果的用法
- mysql 模糊搜索的方法介绍