DFS遍历框架
- 二叉树问题
- 网格问题(岛屿)
- 图(起点-终点)
1、二叉树问题
二叉树的dfs遍历可以写成
void dfs(TreeNode* root)
{
// 判断递归退出的条件 base case
if(root == NULL)
return;
/*
中间根据题意,增加累加或者判断代码
*/
dfs(root->left); //递归左子树
dfs(root->right); //递归右 子树
}
可以看到,二叉树的 DFS 有两个要素:「判断 base case」和「访问相邻结点」。
第一个要素是 判断 base case。一般来说,二叉树遍历的 base case 是 root == null。这样一个条件判断其实有两个含义:一方面,这表示 root 指向的子树为空,不需要再往下遍历了。另一方面,在 root == null 的时候及时返回,可以让后面的 root.left 和 root.right 操作不会出现空指针异常。
第二个要素是访问相邻结点。二叉树的相邻结点非常简单,只有左子结点和右子结点两个。二叉树本身就是一个递归定义的结构:一棵二叉树,它的左子树和右子树也是一棵二叉树。那么我们的 DFS 遍历只需要递归调用左子树和右子树即可。
例题:
2. 网格问题(岛屿)
对于网格问题,同样可以用base case和递归相邻节点来写出他的dfs遍历;
首先,网格 DFS 中的 base case 是什么?从二叉树的 base case 对应过来,应该是网格中不需要继续遍历、grid[r][c] 会出现数组下标越界异常的格子,也就是那些超出网格范围的格子。
即:
if(row < 0 || row >= grid.size() || col < 0 || col >= grid[0].size())
</