树与堆
树与堆都属于非线性结构。树强调递归、层级关系和子问题建模;堆强调“局部最值”的快速维护。它们经常出现在遍历、搜索、优先级调度和 top-k 问题里。
概念
- 树处理的是层级关系和子问题拆分,堆处理的是局部最值维护。
- 树题很多时候不是直接算答案,而是先定义递归函数返回什么。
- 堆题很多时候不是排序,而是持续维护当前最值或 top-k。
怎么处理
- 树题先判断是遍历问题、路径问题还是递归返回值问题。
- 写递归前先说清函数语义和返回值含义。
- 如果题目不断要求“当前最小 / 最大 / 前 k 个”,优先想堆。
- 如果题目涉及连接关系变化,再判断是不是并查集或 Trie 这类扩展结构。
典型实例
| 专题 | 先看什么 |
|---|---|
| 二叉树 | 先把遍历、递归和层序处理讲清楚 |
| 二叉搜索树 | 看有序性如何减少搜索范围 |
| 堆与优先队列 | 看 top-k 和局部最值如何维护 |
| Trie 字典树 | 看前缀问题如何建模 |
| 并查集 | 看连通性问题如何处理 |
看到什么就先想到这类
- 出现“父子层级、路径、子树、遍历”。
- 出现“前 k 个、实时最小 / 最大”。
- 出现“前缀匹配、集合合并、连通块”。