平衡二叉树

225 阅读4分钟

平衡二叉树的概念

平衡二叉树(Balanced Binary Tree)是一种二叉搜索树(BST),并且满足以下条件:

  • 任意节点的左右子树高度差不超过1
    换句话说,对于任意节点 n, ∣Height(left subtree)−Height(right subtree)∣≤1|

这种结构确保了树的高度尽可能低,从而保证了搜索、插入和删除操作的效率接近 O(log⁡n)。


特点

  1. 平衡性

    • 平衡二叉树不是完全平衡的(完全平衡是指所有层的节点都满)。
    • 它允许轻微的不平衡,但严格控制在左右子树高度差不超过1。
  2. 二叉搜索树性质

    • 平衡二叉树仍然满足二叉搜索树的性质:
      对于任意节点 n, left subtree<n<right subtree
  3. 操作复杂度

    • 搜索、插入、删除:时间复杂度接近 O(log⁡n),因为树的高度被控制在 O(log⁡n)。

平衡二叉树的常见类型

1. AVL 树
  • 特点:

    • 严格平衡的二叉搜索树。
    • 每个节点存储一个平衡因子,即 Balance Factor=Height(left)−Height(right),平衡因子的值只能是 −1,0,+1。
    • 若插入或删除导致某节点的平衡因子绝对值超过1,则需要通过旋转操作恢复平衡。
  • 旋转操作:

    • 单旋转(左旋、右旋)
    • 双旋转(先左后右,或先右后左)
2. 红黑树
  • 特点:

    • 一种近似平衡的二叉搜索树,采用节点着色(红/黑)来维持平衡。
    • 每条从根到叶子的路径都包含相同数量的黑色节点。
    • 插入、删除操作的时间复杂度为 O(log⁡n)。
3. B 树 / B+ 树
  • 多路平衡搜索树,广泛用于数据库系统和文件系统。
  • 每个节点可以有多个子节点(不同于二叉树)。
  • 保证所有叶子节点位于同一层。

平衡二叉树的操作(以 AVL 树为例)

1. 插入操作
  • 插入新节点后,可能破坏平衡。

  • 通过旋转操作恢复平衡:

    • LL(左左型) :右旋
    • RR(右右型) :左旋
    • LR(左右型) :先左旋再右旋
    • RL(右左型) :先右旋再左旋
2. 删除操作
  • 删除节点后,可能破坏平衡。
  • 同样通过旋转恢复平衡。

应用场景

  1. 数据库索引:例如,红黑树、B 树、B+ 树等用于高效查找。
  2. 内存管理:操作系统内存分配使用平衡树结构。
  3. 集合与映射:像 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. 平衡因子的取值范围通常是 -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
计算平衡因子:
  1. 节点 3

    • 左子树高度 = 0,右子树高度 = 0
    • 平衡因子:0−0=00 - 0 = 0。
  2. 节点 7

    • 左子树高度 = 0,右子树高度 = 0
    • 平衡因子:0−0=00 - 0 = 0。
  3. 节点 5

    • 左子树高度 = 1(节点 3),右子树高度 = 1(节点 7)
    • 平衡因子:1−1=01 - 1 = 0。
  4. 节点 15

    • 左子树高度 = 0,右子树高度 = 0
    • 平衡因子:0−0=00 - 0 = 0。
  5. 节点 10(根节点):

    • 左子树高度 = 2(节点 5 的高度),右子树高度 = 1(节点 15 的高度)
    • 平衡因子:2−1=12 - 1 = 1。

平衡因子的作用

  1. 判断是否平衡

    • 如果所有节点的平衡因子 ∣Balance Factor∣≤1|\text{Balance Factor}| \leq 1,树是平衡的。
    • 如果某个节点的平衡因子 ∣Balance Factor∣>1|\text{Balance Factor}| > 1,树失衡,需要通过旋转调整。
  2. 维护 AVL 树的平衡

    • 插入或删除节点后,重新计算受影响节点的平衡因子。
    • 如果某个节点失衡,通过单旋转或双旋转恢复平衡。

例子:失衡的情况

假设插入一个新节点导致如下树:

      10
     /  
    5    
   / 
  3  
计算平衡因子:
  1. 节点 3:BF=0−0=0\text{BF} = 0 - 0 = 0
  2. 节点 5:BF=1−0=1\text{BF} = 1 - 0 = 1
  3. 节点 10:BF=2−0=2\text{BF} = 2 - 0 = 2(失衡!)

解决:右旋,恢复平衡。


总结:
平衡因子是通过高度差衡量节点的平衡性,用于判断和维护平衡二叉树(如 AVL 树)的结构。
平衡二叉树的核心在于利用平衡性限制树的高度,从而提升操作效率,同时结合二叉搜索树的特点,简化实现复杂度。