本章要回答的三个问题:把链表的"一个后继"放开成"多个后继",结构获得了什么新力量?为什么二叉搜索树的效率承诺会随插入顺序崩溃、又靠什么修复?堆明明长在数组里,凭什么自称树?
第二章的链表是一根线:每个节点一个后继,走到哪算哪。树把后继放开成多个,立刻出现两个新东西——层次(根到叶有深浅之分)与分支(同一层各走各路)。这两个维度合起来,让"逐步缩小搜索范围"有了几何载体:满二叉树每往下一层,候选集合减半,对数级的复杂度从此有了着落。
但树的效率承诺有前提:树得"长得均衡"。按顺序插入会让二叉搜索树退化成一条链,对数级承诺作废——平衡树(AVL、红黑树)就是修复这门心法的代价与方案。堆则反其道而行:不追求全序,只保证"父胜于子",恰好够用优先级调度,还顺便赢得数组存储的紧凑。Trie 把"逐字符比较"变成"逐层定位",是字符串前缀问题的专属兵器。五种树形结构,五种不同的心法侧重。
值得先记住一个全局判断:树的所有对数级承诺,源头都是"每往下一层、候选减半"这一个动作。后面无论 AVL 的旋转、堆的上浮下沉,还是第七章线段树的区间二分,翻来覆去都是在守护或利用这条性质。抓住它,本章就不散。
对照开头的问题,本章的知识点清单如下:
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 3.1 树的基本功 | 树的词汇与走法 | 四种遍历实现、前中序重建 |
| 3.2 二叉搜索树 | 层次怎么变成效率 | BST 不变量、删除三分支、退化实验 |
| 3.3 平衡二叉树 | 承诺为何崩溃、怎么修 | 四种旋转、AVL 与红黑树对比 |
| 3.4 堆与优先队列 | 只保半序换来什么 | 数组映射、上浮下沉、建堆复杂度 |
| 3.5 Trie 前缀树 | 逐层定位字符串 | 插入与双查找、空间账 |
本章出口有三条线:BST 与平衡树的"有序结构"线,延伸到第五章二分查找与有序容器选型;堆的"半序结构"线,直接支撑第五章堆排序与优先队列应用;树的遍历范式则被第四章整体继承——图的深度优先、广度优先就是树遍历的推广(再加一个 visited 集合防绕圈)。第七章线段树更是把"数组下标树"玩到极致。树形心法是全册承上启下的中盘。练完本章做个小检验:任取一组数,手工按 BST 规则插入、再按堆规则建堆,两棵树画在一起对照——能说清"为什么同样的数据长出完全不同的两棵树",本章的心法就分明了。