
一、树的基础概念
1. 定义
树是一种非线性数据结构,由 n 个有限节点组成层次关系集合。特点:
- 有且仅有一个根节点
- 其余节点分为若干互不相交的子树
- 节点间通过父子关系连接
2. 关键术语
术语 |
定义 |
节点 |
包含数据和子节点引用的单元 |
根节点 |
树的起始节点,没有父节点 |
子节点 |
直接连接到父节点的节点 |
叶子节点 |
没有子节点的节点 |
度 |
节点拥有的子树数目 |
树的高度 |
从根节点到最远叶子节点的最长路径边数 |
树的深度 |
从根节点到当前节点的层数 |
路径 |
从根到某节点的唯一通道 |
3. 分类
- 二叉树:每个节点最多两个子节点(左子树 / 右子树)
- 多叉树:每个节点可包含多个子节点(如三叉树、四叉树)
- 有序树:子树顺序有意义(如二叉搜索树)
- 无序树:子树顺序无关
二、二叉树的核心特性
1. 特殊二叉树
- 满二叉树:所有层节点数达到最大值
- 完全二叉树:最后一层节点靠左排列,其余层满
- 二叉搜索树:左子树值 < 根值 < 右子树值
2. 重要性质
- 第 i 层最多有 2^(i-1) 个节点
- 高度为 h 的二叉树最多有 2^h -1 个节点
- 完全二叉树节点编号 i 的子节点为 2i 和 2i+1
- 叶子节点数 = 度为 2 的节点数 + 1
3. 存储结构
方式 |
实现方式 |
适用场景 |
数组存储 |
按层序编号存储节点值 |
完全二叉树 |
链式存储 |
结构体包含左右指针 |
任意二叉树 |
三、二叉树遍历方法
1. 深度优先遍历
2. 广度优先遍历
3. 遍历对比
遍历方式 |
时间复杂度 |
空间复杂度 |
典型应用 |
前序 |
O(n) |
O(h) |
复制树、生成括号 |
中序 |
O(n) |
O(h) |
二叉搜索树排序 |
后序 |
O(n) |
O(h) |
删除树、计算表达式 |
层序 |
O(n) |
O(w) |
层次处理、找最近公共祖先 |
四、树结构的典型应用
- 文件系统:目录结构(Windows 资源管理器)
- XML/JSON 解析:文档对象模型(DOM)
- 数据库索引:B 树 / B + 树优化查询
- 压缩算法:哈夫曼树构建最优前缀编码
- 人工智能:决策树、蒙特卡洛树搜索
- 网络路由:路由表的层次化存储
五、高级树结构详解
5.1 B 树(B-Tree)
5.1.1 定义与特性
- 平衡多路查找树,所有叶子节点在同一层
- 阶数 m:每个节点最多有 m 个子节点(m≥2)
- 关键特性:
- 根节点至少 2 个子节点
- 非根节点至少⌈m/2⌉个子节点
- 叶子节点包含所有数据
5.1.2 操作复杂度
操作 |
时间复杂度 |
查找 |
O(log_m n) |
插入 |
O(log_m n) |
删除 |
O(log_m n) |
5.1.3 典型应用
- 数据库索引(如 MySQL 的 InnoDB 引擎)
- 文件系统目录结构
- 外部存储数据管理
5.1.4 与二叉搜索树对比
特性 |
B 树 |
二叉搜索树 |
平衡方式 |
多叉平衡 |
二叉平衡 |
查找效率 |
更低的 I/O 次数 |
依赖树的高度 |
适用场景 |
外存数据管理 |
内存数据管理 |
5.2 红黑树(Red-Black Tree)
5.2.1 定义与性质
- 自平衡二叉搜索树,通过颜色标记保持平衡
- 五大性质:
- 节点颜色为红或黑
- 根节点为黑色
- 叶子节点(NIL)为黑色
- 红节点的子节点必须为黑色
- 从任一节点到其叶子的路径包含相同数量黑节点
5.2.2 操作复杂度
操作 |
时间复杂度 |
查找 |
O(log n) |
插入 |
O(log n) |
删除 |
O(log n) |
5.2.3 典型应用
- Java 的 TreeMap/TreeSet
- C++ 的 std::map
- Linux 内核的进程调度
- Nginx 的定时器管理
5.2.4 旋转操作
- 左旋转:将某个节点作为支点向左下方旋转
- 右旋转:将某个节点作为支点向右上方旋转
- 示例代码片段:
收起
python
def left_rotate(x):
y = x.right
x.right = y.left
if y.left:
y.left.parent = x
y.parent = x.parent
if x.parent is None:
root = y
elif x == x.parent.left:
x.parent.left = y
else:
x.parent.right = y
y.left = x
x.parent = y
5.3 其他重要树结构
类型 |
核心特性 |
典型应用 |
AVL 树 |
严格平衡(左右子树高度差≤1) |
内存中的有序数据 |
哈夫曼树 |
带权路径长度最小 |
数据压缩(如 ZIP 算法) |
B + 树 |
所有数据在叶子节点,非叶子存索引 |
数据库索引 |
线段树 |
区间查询优化 |
统计类问题 |
字典树 (Trie) |
前缀共享存储 |
拼写检查、IP 路由表 |
六、树结构对比与选择策略
6.1 平衡树对比
结构 |
平衡条件 |
插入 / 删除复杂度 |
适用场景 |
B 树 |
多叉平衡 |
O(log_m n) |
外存数据管理 |
红黑树 |
颜色标记平衡 |
O(log n) |
内存有序结构 |
AVL 树 |
高度差平衡 |
O(log n) |
频繁查询场景 |
6.2 选择策略
- 内存场景:
- 数据量小 → 二叉搜索树
- 数据量大 → 红黑树 / AVL 树
- 外存场景:
- 特殊需求:
- 前缀匹配 → Trie 树
- 数据压缩 → 哈夫曼树
七、树结构算法优化技巧
- 空间优化:
- 使用数组存储完全二叉树(节省指针空间)
- 共享子树结构(如 Trie 树的前缀共享)
- 时间优化:
- 利用缓存友好性(B 树的节点大小与磁盘块对齐)
- 延迟更新(如红黑树的懒删除)
- 并行处理:
- 多叉树的多路并行查找
- 分布式哈希表(DHT)的树状路由