您的位置:首页 > 其它

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

2013-05-17 17:15 399 查看
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路径上所有结点的;

④:判断是否产生不平衡,若不平衡,则确定旋转类型并做相应调整。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: