图形问题,使用BFS/DFS都要考虑一个结点是不是已经被遍历过了。
不同的场景标记的方式不同,常见的有建辅助数组、直接改动原数组等。
DFS的代码通常比BFS要简洁一些,因为不用建队列、向外拓展也简单,不像BFS还要建数组方便遍历四周。
图的广度优先遍历可以找到某节点到所有节点最少步数,图的深度优先遍历可以找到无环图的拓扑结构
题型总结
BFS
- AAAA433. 最小基因变化
从start开始,把变化范围只有一个字符的字符串加入到队列中,判断这些字符传是不是end,不是的话以这些字符串为基础寻找bank里面与这些字符串相比变化只有一个的字符串。 - AAA1091. 二进制矩阵中的最短路径
多源BFS
与树不同,图的广度优先搜索的起点是多个的,首先要把所有的起点都加入到队列中,然后需要判断邻接的结点是否已遍历。
- AAAAA542. 01 矩阵
将所有是0的结点作为起点,加入到队列中,向外扩散。 - AAAA994. 腐烂的橘子
为了寻找最短的扩展次数,需要让烂橘子同时向外扩展。
遍历数组找到所有的烂橘子加入道队列中。
对内容做抽象
有些BFS解法不容易想到,需要对题目内容进行抽象,然后把节点放入到队列当中,进行遍历。
二维矩阵
- AAA463. 岛屿的周长
一个陆地节点遇到越界或者海便算所做一条边。 - AAAA934. 最短的桥
计算一个坐标到另一个坐标的需要走多少步,不需要两头同时出发一起走,从一个坐标出发BFS遍历直到遇到另一个坐标,记录走过的步数即可。
岛屿问题:
- 0AAAA827. 最大人工岛
计算出每个岛屿的面积,然后挨个考虑每个0.
DFS
- AAAA306. 累加数
每次递归都从num字符串上切分出一个数,然后判断这个数是不是满足要求的。 - AAA386. 字典序排数
递归纵向拓展数的位数,迭代拓展数的横向