定义
二叉树的查询速度取决于树的结构,树的深度越小查找的平均速度就越小,因此希望二叉树的高度尽可能小。前苏联科学家Adelson-Velskii和Landis(这里还是把名字打出来了,哈哈,是希望以后能看到我们中国人的名字)提出平衡二叉树,又称AVL树。
平衡二叉树:左右子树的深度之差绝对值不超过1,左右子树也是平衡二叉树。
平衡因子:节点左右子数深度差值。如下:
不平衡二叉树
平衡二叉树
平衡二叉树的平衡调整方法
具体例子,假如有关键字序列为(13,24,37,90,53),下面为构造平衡树的具体方法:
第一步:以序列的第一个数为根节点
第二步:
第三步:已经出现不平衡了,将在下步进行调整
第四步:调整
第五步:继续添加,又出现不平衡了,将在下步进行调整
剧终
是不是觉得蛮简单的,当出现不平衡时就以出现不平衡因子及它的子节点为子树进行调整,把中间的值作为子树的新根其他作为左右子节点就行了。
那么上面那个平衡二叉树加入关键字为91的节点,该怎弄?是不是觉得不容易调整了?
一般情况下可以归纳为4种情况
都直接上具体例子
- RR型
这时只需要向左的一次逆时针旋转就行
就是把右边节点移到上面去,如果出现三叉就作为根节点左边下面一个节点的右节点。
- LL型
这时只需要向右的一次顺时针旋转就行
就是把左边节点移到上面去,如果出现三叉就作为根节点右边下面一个节点的左节点。
- LR型
(1)LR(0)型
直接把中间值放中间就好
(2)LRL型
分离出RL型子树让现在子树根节点A的右节点B,作为根节点,B原来的左节点作为A的右节点,原来分离的另一部分作为现在根节点的右子树,结果如下
(3)LRR型
调整之后
- RL型
和LR类似不再赘述