完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化
完全理解二叉树(中)——二叉树与树、森林的转化及遍历
1. 平衡二叉树
二叉树可以用于查找元素,对于如下这颗二叉树:
对其的遍历相当于对链表的遍历,因此找到元素5需要从头开始,查找5次,但是如果树的形状是这样:
从根结点出发只需要查找3次即可找到元素5。
1.1 定义
左右子树高度差不超过1的二叉树称为平衡二叉树(AVL树),注意是对于树中的任意结点。
例如:
都不是平衡二叉树。
结点的平衡因子 = 左子树高 - 右子树高,平衡因子的绝对值不超过1,如下图所示:
1.2 存储结构
typedef struct AVLTreeNode* avltree;
struct AVLTreeNode{
int data;
int balance;
avltree lnode,rnode;
};
1.3 左旋与右旋操作
在结点的插入过程中,无论插入的位置在哪,新结点的加入必定会影响平衡因子,可能查找路径上的所有平衡因子都会被影响,因此需要找到一种方法,在整体平衡因子改动最小的基础上,依然满足AVL树的定义。
最小失衡子树:在插入一个结点后,那么这个结点向上查找,第一个出现左右不平衡的树就是最小失衡子树,即找到平衡因子的绝对值先超过 1 的结点。
- 左旋
对于这样一颗树
插入结点 6 后,变成
显然,第一个被破坏的平衡因子就是结点 2,则需要对结点 2 进行左旋转。步骤为:
- 该结点的右孩子代替该结点的位置(结点3代替结点2成为根结点)
- 右孩子的左孩子变成该结点的右孩子(结点4变成结点2的右孩子)
- 该节点变成右孩子结点的左孩子(结点2变成结点3的左孩子)
得到的新平衡二叉树为