AVL Tree
参考:
[1]http://www.geeksforgeeks.org/avl-tree-set-1-insertion/
[2]https://www.cyut.edu.tw/~ckhung/b/al/balst.php
一.二叉搜索树
对任意一个节点
左边的全部节点都比这个节点小
右边的全部节点都比这个节点大
这样要找一个数
就只要比较和当前节点的大小
然后选择在左子树里面找还是右子树里面找
使得搜索的时间复杂度变为logN
二.AVL树
AVL树首先满足二叉搜索树的性质
同时满足对任意一个节点 左子树的高度和右子树高度之差不大于1
这样就让二叉树的高度变小,从而使搜索次数减少
三.二叉树的旋转
y x
/ \ Right Rotation / \
x T3 – – – – – – – > T1 y
/ \ < - - - - - - - / \
T1 T2 Left Rotation T2 T3
这个旋转只是一个专有名词,并不是真正的旋转
所以初学者看的上面这个图就不知所以然了
首先y,x 是点
然机会T1 T2 T3是子树 也就是不止一个点
任何二叉树都可以这么表示
首先考虑右旋,同时假设没有T2
就是这样的图
y
/ \
x T3
/
T1
变成这样的
x
/ \
T1 y
\
T3
这个就是右旋,很直观,把y以x为支点顺时针旋转下去
显然这样旋转是不改变二叉搜索树性质左边小右边大的性质的
如果这个树是一个图的话,就根本没改变图的结构
现在考虑T2
我们T2大哥放在哪里呢?
只能放在y的左子树了
T2比x大,比y小,所以可以放那儿
完了,这就是右旋
左旋不说了
四.AVL树的插入
AVL树核心思想就是先插
插完了看下平不平衡
这里的平衡也是一个”专有名词”
表示二叉树的左右子树的高度之差不大于1
不平衡就通过旋转调整
这样如果这个点不平衡,也就是左右子树之差大于1
那么首先就两种可能
1.左边大 叫 L型
2.右边大 叫 R型
对于这两种情况,又细分成LL,LR,RR,RL四种
第二个L,R表示是插入到这个不平衡点的子树的左边还是右边
具体图如下:
T1, T2, T3 and T4 are subtrees.
z y
/ \ / \
y T4 Right Rotate (z) x z
/ \ - - - - - - - - -> / \ / \
x T3 T1 T2 T3 T4
/ \
T1 T2
z的高度差是2,左边高度3,右边高度1.就不平衡.
是由于新插入的点导致z不平衡的
然后新插入的点在以x为根的子树下
这样对z进行一次右旋就OK了
之后同理,具体看参考资料1
1285

被折叠的 条评论
为什么被折叠?



