1.平衡二叉树
1.1 AVL树的定义
- 定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
1.2 AVL树平衡因子
- 定义:某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。如果某一结点的平衡因子绝对值大于1则说明此树不是平衡二叉树。为了方便计算每一结点的平衡因子可以为每个节点赋予height这一属性,表示此节点的高度。
1.3 AVL树添加节点
- 定义:往平衡二叉树中添加节点或者删除节点很可能会导致二叉树失去平衡,所以我们需要在每次插入节点后进行平衡的维护操作。当插入新结点导致不平衡时, 我们需要找到距离新节点最近的不平衡结点为轴来转动AVL树来达到平衡。插入节点破坏平衡性有如下四种情况:
- 左子树的左子树插入结点(LL):以图为例,节点2是节点6的左子树的左子树。调整方法:右旋。
- 右子树的右子树插入节点 (RR):以图为例,节点9是节点6的右子树的右子树。调整方法:左旋。
- 左子树的右子树插入结点(LR):以图为例,节点6是节点8的左子树的右子树。调整方法:先左旋,再右旋。
- 右子树的左子树插入结点(RL):以图为例,节点12是节点10的右子树的左子树。调整方法:先右旋,再左旋。
1.4 AVL树删除节点
- AVL树是一种特殊的二叉搜索树,所以要考虑的情况和二叉搜索树删除结点一样, 不同的是删除一个结点有可能引起父结点失衡, 所以我们需要在每次回退的时候计算结点高度。二叉排序树 这篇文章有相关介绍。