平衡二叉树( Balanced Binary Tree),简称平衡树(AVL树)。
树上任一结点的左子树和右子树的高度之差不超过1。
结点的平衡因子=左子树高-右子树高。
平衡二叉树结点的平衡因子的值只可能是-1、0或1。
只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树。
//平衡二叉树结点
typedef struct AVLNode {
int key;//数据域
int balance;//平衡因子
struct AVLNode *lchild, *rchild;
} AVLNode, *AVLTree;
在二叉排序树中插入新结点后,
查找路径上的所有结点都有可能受到影响,如何保持平衡?
根据二叉排序树的特性:左子树结点值<根结点值<右子树结点值。
解决方案:右旋操作:
1.步骤:
解决方案:左旋操作:
1.步骤:
解决方案:先左旋后右旋
例如:若C的左子树插入结点导致不平衡的处理
解决方案:先右旋再左旋
例如:在C的子树插入结点的处理
只有左孩子才能右上旋,只有右孩子才能左上旋。
可以证明含有n个结点的平衡二叉树的最大深度为
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n),
平衡二叉树的平均查找长度(即时间复杂度)为
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n).