【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)

简介: 【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)

树类型模板

我们在写一些树的算法题的时候其实最常用的就是DFS。因为我们需要使用一直递归直到找到树的叶子节点,才能直到这棵树的深度且有办法继续去写。那么说到这里我们就来一道求深度的算法题吧!


题目:剑指 Offer 55 - I. 二叉树的深度


输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。


例如:


给定二叉树 [3,9,20,null,null,15,7],


3

/

9 20

/

15 7

返回它的最大深度 3 。


从本题我们能大概的直到本题的目的就是求一颗二叉树的最大深度。


思路:求最大深度,我们可以使用递归,找到左右子树到叶子节点的深度并且取最大值。


image.png


我们可以看上图左子树的最大深度是1,而右子树的最大深度是2。则我们取深度的最大值并加上1(根节点本身也算1个深度)就是我们所需要得到的结果了。(图做的有点抽象,大家别建议5555)。


Java版本:


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        //判断一个根节点是是否为空,如果为空则返回0。
        if(root == null){
            return 0;
        }
        //进行一个递归判断左子树和右子树的最大值并加上一。
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}



Python版本:


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#思路是和Java版本的一样的。
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1


因为树的很多大部分都是递归写法,和这个相差不太大,所以我就只给上面一个例题。接下来就是给大家附练习题了。




表格遍历模板

本模板和BFS其实有一些地方是相同的:最常见的就是上下左右四个方向的判断。


那我们还是拿最经典的岛屿问题来讲解这个问题。


题目:200. 岛屿数量

题目:


给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。


岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。


此外,你可以假设该网格的四条边均被水包围。


示例 1:


输入:grid = [

[“1”,“1”,“1”,“1”,“0”],

[“1”,“1”,“0”,“1”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“0”,“0”,“0”]

]

输出:1

示例 2:


输入:grid = [

[“1”,“1”,“0”,“0”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“1”,“0”,“0”],

[“0”,“0”,“0”,“1”,“1”]

]

输出:3

image.png




其实本题使用DFS也是使用沉岛的思想,使用循环逐一遍历这个grid如果为1就res结果集就加一,且使用DFS沉岛。


具体的流程我们可以看代码来逐步分析。


Java版本:


class Solution {
    //设置返回结果集
    int res = 0;
    public int numIslands(char[][] grid) {
        //获取grid的长和宽。
        int m = grid.length;
        int n = grid[0].length;
        //for循环遍历整个grid表格。
        for (int i = 0 ; i < m ; i++ ){
            for (int j = 0 ; j < n ;j ++ ){
                //发现陆地‘1’的时候res加一,且是用dfs沉岛。
                if (grid[i][j] == '1'){
                    res += 1;
                    dfs(i,j,m,n,grid);
                }
            }
        }
        //返回最后结果
        return res;
    }
    //定义dfs方法,用来沉岛
    void dfs(int x , int y,int m , int n , char[][] grid) {
        //判断如果越界和不是陆地则结束递归。
        if (x < 0 || y < 0 || x >= m || y >= n || grid[x][y]== '0') return ;
        //如果grid[x][y] == '1',则把它变为'0'且继续使用DFS遍历x,y四周的岛屿。
        grid[x][y] = '0';
        dfs(x - 1,y,m,n,grid);
        dfs(x + 1,y,m,n,grid);
        dfs(x , y + 1,m,n,grid);
        dfs(x , y - 1,m,n,grid);
    }
}


Python版本:


class Solution:
    #Python的大体思路是和上面Java的一样,这里我就不再过多的叙述了。
    def numIslands(self, grid: List[List[str]]) -> int:
        x = len(grid)
        y = len(grid[0])
        def dfs (grid,i,j):
            if i < 0 or j < 0 or i >=  x or j >= y or grid[i][j] =='0':
                return 
            grid[i][j] = '0'
            dfs (grid,i-1,j)
            dfs (grid,i+1,j)
            dfs (grid,i,j-1)
            dfs (grid,i,j+1)
        num = 0
        for i in range(x):
            for j in range(y):
                if grid[i][j] == '1':
                    dfs(grid,i,j)
                    num += 1
        return num



因为岛屿这种表格题也是非常简单的,无论是使用DFS还是BFS。我们都可以套用模板来解决这种类型的问题,但是为了能更好的提高自己的算法能能力,博主还是建议大家能够去多多练习的,同时下面也整理了一些习题为大家加餐。


总结

本文也是到了尾声,同时非常感谢能看到这里的小伙伴们,也更希望本文能对你们有所帮助。这个系列—算法模板如果没有什么意外博主是会一直更新下去的,更希望能帮助一下初学的小伙伴们。


每一篇文章都是博主十分用心创作出来的,如果能给大家带来帮助希望大家来个一键三连。这将会是博主最大的动力哦!!!


相关文章
|
1月前
|
算法
DFS算法的实现
DFS算法的实现
34 3
|
1月前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
3月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
36 4
|
3月前
|
算法 Java 数据处理
Java算法模板 数据流快读
Java算法模板 数据流快读
23 2
|
3月前
|
算法
数据结构与算法-DFS+BFS篇(迷宫问题)
数据结构与算法-DFS+BFS篇(迷宫问题)
38 3
|
2月前
|
设计模式 JavaScript 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
63 0
|
3月前
|
算法 Java
Java数据结构与算法:图算法之深度优先搜索(DFS)
Java数据结构与算法:图算法之深度优先搜索(DFS)
|
3月前
|
算法 前端开发 安全
C++算法模板
C++算法模板
23 0
|
3月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。