Skip to content

树与堆

树与堆都属于非线性结构。树强调递归、层级关系和子问题建模;堆强调“局部最值”的快速维护。它们经常出现在遍历、搜索、优先级调度和 top-k 问题里。

概念

  • 树处理的是层级关系和子问题拆分,堆处理的是局部最值维护。
  • 树题很多时候不是直接算答案,而是先定义递归函数返回什么。
  • 堆题很多时候不是排序,而是持续维护当前最值或 top-k。

怎么处理

  1. 树题先判断是遍历问题、路径问题还是递归返回值问题。
  2. 写递归前先说清函数语义和返回值含义。
  3. 如果题目不断要求“当前最小 / 最大 / 前 k 个”,优先想堆。
  4. 如果题目涉及连接关系变化,再判断是不是并查集或 Trie 这类扩展结构。

典型实例

专题先看什么
二叉树先把遍历、递归和层序处理讲清楚
二叉搜索树看有序性如何减少搜索范围
堆与优先队列看 top-k 和局部最值如何维护
Trie 字典树看前缀问题如何建模
并查集看连通性问题如何处理

看到什么就先想到这类

  • 出现“父子层级、路径、子树、遍历”。
  • 出现“前 k 个、实时最小 / 最大”。
  • 出现“前缀匹配、集合合并、连通块”。