平衡二叉树的概念
平衡二叉树(Balanced Binary Tree)是一种二叉搜索树(BST),并且满足以下条件:
- 任意节点的左右子树高度差不超过1。
换句话说,对于任意节点 n, ∣Height(left subtree)−Height(right subtree)∣≤1|
这种结构确保了树的高度尽可能低,从而保证了搜索、插入和删除操作的效率接近 O(logn)。
特点
-
平衡性
- 平衡二叉树不是完全平衡的(完全平衡是指所有层的节点都满)。
- 它允许轻微的不平衡,但严格控制在左右子树高度差不超过1。
-
二叉搜索树性质
- 平衡二叉树仍然满足二叉搜索树的性质:
对于任意节点 n, left subtree<n<right subtree
- 平衡二叉树仍然满足二叉搜索树的性质:
-
操作复杂度
- 搜索、插入、删除:时间复杂度接近 O(logn),因为树的高度被控制在 O(logn)。
平衡二叉树的常见类型
1. AVL 树
-
特点:
- 严格平衡的二叉搜索树。
- 每个节点存储一个平衡因子,即 Balance Factor=Height(left)−Height(right),平衡因子的值只能是 −1,0,+1。
- 若插入或删除导致某节点的平衡因子绝对值超过1,则需要通过旋转操作恢复平衡。
-
旋转操作:
- 单旋转(左旋、右旋)
- 双旋转(先左后右,或先右后左)
2. 红黑树
-
特点:
- 一种近似平衡的二叉搜索树,采用节点着色(红/黑)来维持平衡。
- 每条从根到叶子的路径都包含相同数量的黑色节点。
- 插入、删除操作的时间复杂度为 O(logn)。
3. B 树 / B+ 树
- 多路平衡搜索树,广泛用于数据库系统和文件系统。
- 每个节点可以有多个子节点(不同于二叉树)。
- 保证所有叶子节点位于同一层。
平衡二叉树的操作(以 AVL 树为例)
1. 插入操作
-
插入新节点后,可能破坏平衡。
-
通过旋转操作恢复平衡:
- LL(左左型) :右旋
- RR(右右型) :左旋
- LR(左右型) :先左旋再右旋
- RL(右左型) :先右旋再左旋
2. 删除操作
- 删除节点后,可能破坏平衡。
- 同样通过旋转恢复平衡。
应用场景
- 数据库索引:例如,红黑树、B 树、B+ 树等用于高效查找。
- 内存管理:操作系统内存分配使用平衡树结构。
- 集合与映射:像 Java 的 TreeMap 和 TreeSet、C++ 的 STL 的 map 和 set 都基于红黑树。
Balance Factor(平衡因子)的定义
Balance Factor(平衡因子) 是平衡二叉树中每个节点的一个属性,用于衡量该节点的平衡状态。
定义公式:
Balance Factor (BF)=Height(left subtree)−Height(right subtree)\text{Balance Factor (BF)} = \text{Height(left subtree)} - \text{Height(right subtree)}
其中:
- Height(left subtree) :当前节点左子树的高度。
- Height(right subtree) :当前节点右子树的高度。
特点:
-
平衡因子的取值范围通常是 -1、0、1。
- 如果 ∣Balance Factor∣>1|\text{Balance Factor}| > 1,树失衡,需要进行旋转操作。
- 如果 ∣Balance Factor∣≤1|\text{Balance Factor}| \leq 1,则节点是平衡的。
如何计算树的高度(Height)
树的高度是从某个节点到其最深的叶节点的最长路径上的边数。计算方法是递归的:
- 如果节点为空,返回高度 0。
- 如果节点非空: Height(node)=1+max(Height(left subtree),Height(right subtree))\text{Height(node)} = 1 + \max(\text{Height(left subtree)}, \text{Height(right subtree)})
Balance Factor 的示例
假设一棵二叉树如下:
10
/ \
5 15
/ \
3 7
计算平衡因子:
-
节点 3:
- 左子树高度 = 0,右子树高度 = 0
- 平衡因子:0−0=00 - 0 = 0。
-
节点 7:
- 左子树高度 = 0,右子树高度 = 0
- 平衡因子:0−0=00 - 0 = 0。
-
节点 5:
- 左子树高度 = 1(节点 3),右子树高度 = 1(节点 7)
- 平衡因子:1−1=01 - 1 = 0。
-
节点 15:
- 左子树高度 = 0,右子树高度 = 0
- 平衡因子:0−0=00 - 0 = 0。
-
节点 10(根节点):
- 左子树高度 = 2(节点 5 的高度),右子树高度 = 1(节点 15 的高度)
- 平衡因子:2−1=12 - 1 = 1。
平衡因子的作用
-
判断是否平衡:
- 如果所有节点的平衡因子 ∣Balance Factor∣≤1|\text{Balance Factor}| \leq 1,树是平衡的。
- 如果某个节点的平衡因子 ∣Balance Factor∣>1|\text{Balance Factor}| > 1,树失衡,需要通过旋转调整。
-
维护 AVL 树的平衡:
- 插入或删除节点后,重新计算受影响节点的平衡因子。
- 如果某个节点失衡,通过单旋转或双旋转恢复平衡。
例子:失衡的情况
假设插入一个新节点导致如下树:
10
/
5
/
3
计算平衡因子:
- 节点 3:BF=0−0=0\text{BF} = 0 - 0 = 0
- 节点 5:BF=1−0=1\text{BF} = 1 - 0 = 1
- 节点 10:BF=2−0=2\text{BF} = 2 - 0 = 2(失衡!)
解决:右旋,恢复平衡。
总结:
平衡因子是通过高度差衡量节点的平衡性,用于判断和维护平衡二叉树(如 AVL 树)的结构。
平衡二叉树的核心在于利用平衡性限制树的高度,从而提升操作效率,同时结合二叉搜索树的特点,简化实现复杂度。