面试知识库

Trie 与图建模模板:前缀匹配和邻接关系的通用起手式#

Trie 和图建模看起来是两个方向,但它们有一个共同点:

都是在“先把数据结构搭对”,后面的搜索和判断才会顺。

一个偏向字符串前缀结构,一个偏向节点之间的关系结构。

⚡ 速记版模板#

for (int node = 0; node < n; node++) { // 初始化 n 个节点的邻接表桶
    graph.add(new ArrayList<>()); // graph[node] 存 node 的出边邻居
}
for (int[] edge : edges) { // 遍历每条有向边
    graph.get(edge[1]).add(edge[0]); // 建边:先修 edge[1] 才能学 edge[0]
    indegree[edge[0]]++; // 目标节点入度 +1
}
java

🎯 什么时候想到 Trie?#

典型信号:

  • 字符串前缀匹配
  • 自动补全
  • 多个单词共享前缀
  • 插入、查询、前缀判断都要高效

Hot 100 里的典型题目:

💡 Trie 模板#

🎯 什么时候想到图建模?#

典型信号:

  • 课程依赖、任务依赖
  • 节点之间有连接关系
  • 需要遍历所有相邻节点
  • 需要判断是否有环
  • 拓扑排序、连通性、最短路

Hot 100 里的典型题目:

💡 模板一:邻接表建图#

这是课程表类题目的典型写法。

💡 模板二:入度数组 + 拓扑排序#

⚠️ 易错点#

  1. Trie 节点终止标记漏掉

    • search 和 startsWith 的区别就在这里
  2. 图的边方向建反

    • 课程表特别容易把依赖方向弄反
  3. 邻接矩阵滥用

    • 大多数面试题更适合邻接表
  4. 拓扑排序只建图不维护入度

    • BFS 版拓扑排序必须要有入度数组

🎨 面试时怎么说#

这题的关键不是一上来就搜,而是先把结构建出来。Trie 题先建前缀树,图题先明确节点和边,再决定用 BFS、DFS 还是拓扑排序。

📌 一句话总结#

  • Trie 负责高效前缀匹配
  • 图建模负责把关系描述清楚
  • 结构一旦搭对,后续遍历就很自然