完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化
完全理解二叉树(中)——二叉树与树、森林的转化及遍历
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的左孩子)
得到的新

本文详细介绍了平衡二叉树(AVL树)的概念、存储结构、旋转操作及平衡调整策略。接着讲解了二叉排序树的定义、存储结构及其查找、插入、删除操作。最后探讨了哈夫曼树的背景、构建过程和性质,展示如何通过哈夫曼树优化数据查找效率。
最低0.47元/天 解锁文章
2015

被折叠的 条评论
为什么被折叠?



