动态查找之平衡二叉树(AVL)

AVL出现的原因:

BST是一种查找效率比较高的组织形式,但其平均查找长度受树的形态影响较大,形态比较均匀时查找效率很好,形态明显偏向某一方向时其效率就大大降低。

因此,希望有更好的二叉排序树,其形态总是均衡的,查找时能得到最好的效率,这就是平衡二叉排序树。

AVL的定义:

平衡二叉树或者是空树,或者是满足下列性质的二叉树。

⑴:左子树和右子树深度之差的绝对值不大于1;

⑵:左子树和右子树也都是平衡二叉树。

结点类型定义如下:

typedef  struct  BNode

{  KeyType  key ;    /*  关键字域  */

int  Bfactor ;      /*  平衡因子域  */【左子树的深度减右子树的深度

…      /*  其它数据域  */

struct  BNode  *Lchild , *Rchild ;

}BSTNode ;

平均查找长度:和㏒2n是一个数量级的

平衡化旋转:(构造平衡二叉排序树的方法

失衡结点:结点的平衡因子和子树深度都会发生变化;

查找失衡结点:沿着插入结点上行到根结点就能找到某些结点;

1   LL型平衡化旋转

    失衡原因:在结点a的左孩子的左子树上进行插入,插入使结点a失去平衡。

   平衡化旋转方法:通过顺时针旋转操作实现

                                   用b取代a的位置,a成为b的右子树的根结点,b原来的右子树作为a的左子树。

2   LR型平衡化旋转

    失衡原因:在结点a的左孩子的右子树上进行插入,插入使结点a失去平衡。

   平衡化旋转方法:先进行一次逆时针旋转,再进行一次顺时针旋转

3   RL型平衡化旋转

   失衡原因:在结点a的右孩子的左子树上进行插入,插入使结点a失去平衡,与LR型正好对称。

  平衡化旋转方法:先进行一次顺时针旋转,再进行一次逆时针旋转

4  RR型平衡化旋转

   失衡原因:在结点a的右孩子的右子树上进行插入,插入使结点a失去平衡。

   平衡化旋转方法:进行一次逆时针旋转,与LL型正好对称

其上旋转的正确性由“遍历所得中序序列不变”来证明

AVL树的插入:

①:按照二叉排序树的定义,将结点s插入;

②:在查找结点s的插入位置的过程中,记录离结点s最近且平衡因子不为0的结点a,若该结点不存在,则结点a指向根结点;

③: 修改结点a到结点s路径上所有结点的;

④:判断是否产生不平衡,若不平衡,则确定旋转类型并做相应调整。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值