【说明】博客内容选自课件内容和学堂在线邓俊辉老师《数据结构下》
1. 二叉平衡树定义
问题:
l二叉排序树的缺点是无法事先预料树的结构,随意性很大,树结构只与结点的值和插入的次序有关,有时会得到一颗很不平衡的二叉树。
l当二叉树与理想的平衡树相差越远,树的高度越高时,其运算的时间就越长。最坏的情况下,二叉树退化成单链表,其时间复杂度由O(log2n)变为O(n)。
二叉平衡树(又称AVL树)
一棵二叉平衡树或者是空树,或者是具有下列性质的二叉排序树:
1。左子树和右子树都是二叉平衡树,
2。左子树和右子树的高度之差的绝对值不超过1。
结点的平衡因子:
左子树的高度减右子树的高度 。
如何构造“二叉平衡树”?
构造平衡的二叉排序树的方法是:
根据初始序列,从空树开始插入新结点,插入过程中,在保持二叉排序树特性的前提下,采用平衡旋转技术,对最小不平衡子树进行调整,使其平衡。
2. 平衡旋转技术
如果在一棵平衡的二叉搜索树中插入一个新结点,造成了不平衡。此时必须调整树的结构,使之平衡。
平衡旋转有两类:
单旋转 (左旋和右旋)
双旋转 (左平衡和右平衡)
右单旋转:
如果在左子树根结点的左子树上插入结点,引起不平衡,则需要进行右单旋转。
以结点B为旋转轴,将结点A顺时针旋转。
左单旋转 :
如果在右子树根结点的右子树上插入结点,引起不平衡,则需要进行左单旋转
以结点C为旋转轴,让结点A逆时针旋转。
先左后右双旋转
如果在左子树根结点的右子树上插入结点,引起不平衡,则需要进行先左后右双旋转 。
先右后左双旋转
如果在右子树根结点的左子树上插入结点引起不平衡,则需要进行先右后左双旋转 。
3. 二叉平衡树的插入
双旋插入代码实现:
4.二叉平衡树删除
删除单旋: