动态查找之平衡二叉树(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路径上所有结点的;
④:判断是否产生不平衡,若不平衡,则确定旋转类型并做相应调整。
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路径上所有结点的;
④:判断是否产生不平衡,若不平衡,则确定旋转类型并做相应调整。
相关文章推荐
- 动态查找---->平衡二叉树(AVL树)
- 平衡二叉树平衡二叉树(AVL)--查找、删除、插入(Java实现)
- C++——算法基础之动态查找表2——平衡二叉树(插入)
- 查找结构 动态查找树比较 树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)
- 算法学习记录-查找——平衡二叉树(AVL)
- 平衡二叉树(AVL)--查找、删除、插入(Java实现)
- 动态查找树比较——BST、AVL、RBT、B、B+
- 平衡二叉树(AVL)--查找、删除、插入(Java实现)
- 平衡二叉树(AVL)的插入、删除、查找的java实现
- 动态查找树比较: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)
- 查找(AVL平衡二叉树)
- 动态查找---->平衡二叉树(AVL树)
- 动态查找---->平衡二叉树(AVL树)
- 算法学习记录-查找——平衡二叉树(AVL)
- 13.动态查找.平衡二叉树(AVL树)
- 查找(二)动态表查找
- 树——平衡二叉树插入和查找的JAVA实现
- 动态查找---->B树(broad-tree 平衡多路查找树)
- 动态查找---->B+树、B*树
- C#4.0新特性(1):Dynamic Lookup 动态查找