DFS

主要使用递归,每次把问题规模减小,但问题本身不变,一直递归到 base case 之后return。

关键点

  • 找到问题相同但规模减小的子问题。
  • 确定共同的参数。
  • 确定base case。

BFS

主要使用Queue,每次到一个新节点之后把当前可能的延伸方向放入queue中,每次从queue中取。需要注意的是如何缓存每一步的相关状态(如树的层数,迷宫的当前步数等。)

关键点

  • 确定某一情况的最邻近情况(如果树节点的children,迷宫的上下左右,word ladder每个词变一次的变种等)
  • 把临近情况都放在queue中,如果需要区分每一层,则放在另一个queue2中
  • 一直poll queue
  • 如果涉及到某节点可能会重复遍历多次的时候,需要有一个visited的map来标记是否处理过或者set来删除已经处理过的节点。
  • 确定好标记或者删除的位置,如果可能有多个不同路径到达同一节点,并且需要区分不同路径,则需要处理完当前层后再标记(如word ladder中的不同路径);如果不需要区分,只是记录最值(通常跟层数有关),则在第一次处理之后立即标记,免得当前层可能访问多次(如surrounded region翻转临近格子)。