{"name":"树","id":"算法与数据结构-树","content":"# 树\n\n## 一、树的第一性原理\n\n### 1. 树解决的本质问题\n\n从抽象层看，**树并不是一种具体结构，而是一类问题的解空间表达**。\n\n树用于解决以下四类稳定问题：\n\n1. **层级关系的表达**（Hierarchy）\n2. **局部有序性的维护**（Local Order）\n3. **动态集合的增删查**（Dynamic Set）\n4. **在全局约束下进行局部调整**（Local Fix under Global Invariant）\n\n> 任何被称为“树”的结构，本质上都在维护某种**不变量（Invariant）**。\n\n---\n\n### 2. 树的统一抽象模型\n\n所有树结构都可以抽象为：\n\n> **节点集合 + 约束规则 + 维护策略**\n\n| 抽象维度 | 含义          |\n| ---- | ----------- |\n| 节点   | 承载数据或状态     |\n| 约束   | 必须始终成立的不变量  |\n| 维护   | 插入、删除时的修复策略 |\n\n后续所有具体树，都是该模型的不同实例化。\n\n---\n\n## 二、搜索树问题域（Ordered Set）\n\n### 1. 问题定义\n\n搜索树要解决的不是“存储”，而是：\n\n> **如何在动态变化的数据集中，持续维护一个有序集合**。\n\n核心操作：\n\n* 查找（Search）\n* 插入（Insert）\n* 删除（Delete）\n\n核心指标：\n\n* 操作时间复杂度\n* 平衡维护成本\n\n---\n\n## 三、二叉查找树（BST）——最小约束模型\n\n### 1. 不变量\n\n* 左子树所有键 < 当前节点\n* 右子树所有键 > 当前节点\n\n这是**有序性最小约束**。\n\n### 2. 特点\n\n* 结构完全由插入顺序决定\n* 不保证平衡\n* 最坏情况退化为链表\n\n### 3. 定位\n\n> BST 是**理论基线模型**，而非工程最终方案。\n\n它回答的是：\n\n> *如果只维护有序性，会发生什么？*\n\n---\n\n## 四、失衡问题与“平衡”这一设计目标\n\n### 1. 核心矛盾\n\n* 有序性需要结构约束\n* 动态插入破坏结构\n\n因此引出一个核心设计问题：\n\n> **是否、以及在多大程度上，应该为“平衡”付出代价？**\n\n---\n\n## 五、AVL 树 —— 强平衡解\n\n### 1. 不变量\n\n* 任意节点左右子树高度差 ≤ 1\n\n### 2. 维护策略\n\n* 单旋 / 双旋\n\n### 3. 代价与取舍\n\n| 维度    | 结论  |\n| ----- | --- |\n| 查找    | 极快  |\n| 插入/删除 | 代价高 |\n| 实现复杂度 | 高   |\n\n> AVL 追求的是**结构最优**，而非工程最优。\n\n---\n\n## 六、2-3 树 —— 完全平衡的理想模型\n\n### 1. 不变量\n\n* 所有叶子节点深度一致\n* 节点可包含 1 或 2 个键\n\n### 2. 设计意义\n\n* 理论上的完美平衡\n* 插入时通过“分裂”维护结构\n\n### 3. 局限\n\n* 不适合直接用二叉指针实现\n\n> 2-3 树更多是**概念模型**，而非工程结构。\n\n---\n\n## 七、红黑树 —— 工程折中解\n\n### 1. 核心思想\n\n> **用颜色编码 2-3 树结构，在不改变二叉结构的前提下近似平衡。**\n\n### 2. 不变量（抽象层）\n\n* 黑高一致\n* 不存在连续红节点\n\n### 3. 工程价值\n\n| 维度     | 表现 |\n| ------ | -- |\n| 平衡强度   | 中  |\n| 操作成本   | 低  |\n| 工程可维护性 | 高  |\n\n> 红黑树牺牲“极致平衡”，换取“稳定性能”。\n\n---\n\n## 八、搜索树的演进总结\n\n| 结构  | 平衡策略 | 工程定位 |\n| --- | ---- | ---- |\n| BST | 无    | 理论基线 |\n| AVL | 强    | 特殊场景 |\n| 2-3 | 完全   | 理论模型 |\n| 红黑树 | 近似   | 工程主流 |\n\n---\n\n## 九、堆 —— 极值优先的问题域\n\n### 1. 问题定义\n\n> **如何在动态集合中，高效获取最大或最小元素？**\n\n### 2. 不变量\n\n* 父节点 ≥ / ≤ 子节点\n\n### 3. 特点\n\n* 不维护全序\n* 只保证极值正确\n\n> 堆是**放弃有序性以换取性能**的典型代表。\n\n---\n\n## 十、并查集 —— 连通性抽象\n\n### 1. 问题定义\n\n> **元素是否属于同一集合？**\n\n### 2. 不变量\n\n* 每个集合存在唯一代表元\n\n### 3. 优化本质\n\n* 按秩合并：控制树高\n* 路径压缩：延迟优化\n\n> 并查集是“树思想”在**图连通问题**中的特化应用。\n\n---\n\n## 十一、树结构的选型心智模型\n\n### 1. 问题 → 结构映射\n\n| 问题特征 | 结构选择 |\n| ---- | ---- |\n| 有序集合 | 红黑树  |\n| 极值频繁 | 堆    |\n| 连通性  | 并查集  |\n\n### 2. 设计哲学总结\n\n* 没有“最优结构”\n* 只有“最合适的约束”\n\n## 关联内容（自动生成）\n\n- [/算法与数据结构/查找.md](/算法与数据结构/查找.md) 搜索树与查找算法密切相关，特别是有序集合的查找操作\n- [/算法与数据结构/基本数据结构.md](/算法与数据结构/基本数据结构.md) 包含了与树结构相关的基础数据结构，如链表等\n- [/算法与数据结构/散列表.md](/算法与数据结构/散列表.md) 散列表与搜索树在某些场景下可以相互替代，了解其差异有助于选型\n- [/中间件/数据库/索引.md](/中间件/数据库/索引.md) 数据库索引大量使用了B+树等树结构，是树在工程实践中的重要应用\n- [/算法与数据结构/图.md](/算法与数据结构/图.md) 并查集是树思想在图连通性问题中的应用，图与树有密切关系\n- [/算法与数据结构/排序.md](/算法与数据结构/排序.md) 堆排序利用了堆这种特殊树结构，树与排序算法有交集\n- [/编程语言/JAVA/高级/集合/集合.md](/编程语言/JAVA/高级/集合/集合.md) Java集合框架中包含了红黑树等树结构的具体实现\n","metadata":"tags: ['算法', '数据结构', '数据结构与算法']","hasMoreCommit":false,"totalCommits":7,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-28T13:46:24+08:00","author":"MY","message":"docs(算法与数据结构): 更新树结构文档","hash":"654d1cedecaa521057e31da82c0d593bbbae64ee"},{"date":"2026-01-28T11:54:38+08:00","author":"MY","message":"docs(算法与数据结构): 重构树结构文档并添加相关图片资源","hash":"431c5abacf344b019fb43c6abebbdfe3f4f9584d"},{"date":"2025-11-16T21:30:56+08:00","author":"MY","message":"docs: 统一并精简文档标签","hash":"21362e9d7aeb62e05364cd5e7f3a3c24d7e293c7"},{"date":"2024-02-22T19:29:07+08:00","author":"MY","message":"📦算法与数据结构","hash":"a43c1f5ba155151373c1c4acad9c95803f6ca65a"},{"date":"2022-07-08T17:45:19+08:00","author":"cjiping","message":"✏️更新 数据结构","hash":"167b36bdc37603af417a45def3bb166a9a639982"},{"date":"2020-09-22T12:17:20+08:00","author":"MY","message":"➕增加 树","hash":"b5aa6d1e98b5247469bd2381bb4dc3aad1bfb7ba"}],"createTime":"2020-09-22T12:17:20+08:00"}