6.4平衡二叉树(AVL树)
二叉排序树的形状住要时高度不一样的时候性能差距很大,为了避免二叉排序树由于高度增长过快导致性能降低,所以我们需要对二叉排序树做出一定的限制。
平衡二叉树:是特殊的二叉排序树,特殊的地方在于左右子树的高度差绝对值不超过一,而且左右子树又是一颗平衡二叉树。(每个结点的平衡因子只能为1,0,-1)
平衡因子:定义结点左子树和右子树的高度差为该结点的平衡因子。
平衡二叉树的建立过程和二叉排序树的建立过程时相似的,都是从一棵空树开始陆续插入结点。不同的地方在于对于平衡二叉树的建立过程中,插入结点可能会破坏结点的平衡性,所以需要平衡调整。
最小不平衡二叉树:以距离插入结点最近的,平衡因子绝对值大于1的结点为根的子树称为最小不平衡子树
不平衡原因:
解决办法:
RL LR 解决办法(最小不平衡子树根结点的平衡因子为-2<0他的孩子结点平衡因子为1>0):先将孩子结点的平衡因子转换成和根结点正负一致,在进行调整。
举例:
自己就是最小平衡子树,由于插入15导致不平衡,时根结点的左孩子的左子树导致,所以进行LL调整。
根结点的平衡因子为正数,所以进行右旋
由于插入115导致34这个结点的不平衡,115时34的右孩子的右子树,所以时RR调整。
由于插入28号导致23这个结点不平衡,28是23的右孩子的左子树,所以是RL调整。这时需要两步完成。
1)先把平衡因子绝对值超出1的结点的右子树根结点的平衡因子换成负值,这道题中就是把以98为根结点的子树右旋
2)此时最小不平衡子树的跟结点的的平衡因子为-2,右孩子是-1,变成了RR情况,所以以孩子结点34进行左旋
RL调整:
1)最小不平衡子树的跟结点右孩子为根结点的子树右旋
2) 左旋:
时间复杂度:
含有n个结点平衡二叉树的最大深度为O(Log2n),因此,平衡而二叉树的平均查找长度为O(Log2n)。
结论: