自己电脑做局域网网站服务器在线动画手机网站模板下载安装

一、树的基础概念
1. 定义
树是一种非线性数据结构,由 n 个有限节点组成层次关系集合。特点:
- 有且仅有一个根节点
 - 其余节点分为若干互不相交的子树
 - 节点间通过父子关系连接
 
2. 关键术语
| 术语 | 定义 | 
|---|---|
| 节点 | 包含数据和子节点引用的单元 | 
| 根节点 | 树的起始节点,没有父节点 | 
| 子节点 | 直接连接到父节点的节点 | 
| 叶子节点 | 没有子节点的节点 | 
| 度 | 节点拥有的子树数目 | 
| 树的高度 | 从根节点到最远叶子节点的最长路径边数 | 
| 树的深度 | 从根节点到当前节点的层数 | 
| 路径 | 从根到某节点的唯一通道 | 
3. 分类
- 二叉树:每个节点最多两个子节点(左子树 / 右子树)
 - 多叉树:每个节点可包含多个子节点(如三叉树、四叉树)
 - 有序树:子树顺序有意义(如二叉搜索树)
 - 无序树:子树顺序无关
 
二、二叉树的核心特性
1. 特殊二叉树
- 满二叉树:所有层节点数达到最大值
 - 完全二叉树:最后一层节点靠左排列,其余层满
 - 二叉搜索树:左子树值 < 根值 < 右子树值
 
2. 重要性质
- 第 i 层最多有 2^(i-1) 个节点
 - 高度为 h 的二叉树最多有 2^h -1 个节点
 - 完全二叉树节点编号 i 的子节点为 2i 和 2i+1
 - 叶子节点数 = 度为 2 的节点数 + 1
 
3. 存储结构
| 方式 | 实现方式 | 适用场景 | 
|---|---|---|
| 数组存储 | 按层序编号存储节点值 | 完全二叉树 | 
| 链式存储 | 结构体包含左右指针 | 任意二叉树 | 
三、二叉树遍历方法
1. 深度优先遍历
- 前序遍历:根→左→右
递归实现:收起
python
def preorder(root):if root:print(root.val)preorder(root.left)preorder(root.right) - 中序遍历:左→根→右
应用: 二叉搜索树中序遍历结果有序 - 后序遍历:左→右→根
应用: 计算表达式树 
2. 广度优先遍历
- 层序遍历:逐层访问节点
队列实现:收起
python
def levelorder(root):queue = [root]while queue:node = queue.pop(0)print(node.val)if node.left: queue.append(node.left)if node.right: queue.append(node.right) 
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.rightx.right = y.leftif y.left:y.left.parent = xy.parent = x.parentif x.parent is None:root = yelif x == x.parent.left:x.parent.left = yelse:x.parent.right = yy.left = xx.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 树
 
 - 外存场景: 
- 读多写少 → B + 树
 - 读写均衡 → B 树
 
 - 特殊需求: 
- 前缀匹配 → Trie 树
 - 数据压缩 → 哈夫曼树
 
 
七、树结构算法优化技巧
- 空间优化: 
- 使用数组存储完全二叉树(节省指针空间)
 - 共享子树结构(如 Trie 树的前缀共享)
 
 - 时间优化: 
- 利用缓存友好性(B 树的节点大小与磁盘块对齐)
 - 延迟更新(如红黑树的懒删除)
 
 - 并行处理: 
- 多叉树的多路并行查找
 - 分布式哈希表(DHT)的树状路由
 
 
