树类型模板
我们在写一些树的算法题的时候其实最常用的就是DFS。因为我们需要使用一直递归直到找到树的叶子节点,才能直到这棵树的深度且有办法继续去写。那么说到这里我们就来一道求深度的算法题吧!
题目:剑指 Offer 55 - I. 二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
从本题我们能大概的直到本题的目的就是求一颗二叉树的最大深度。
思路:求最大深度,我们可以使用递归,找到左右子树到叶子节点的深度并且取最大值。
我们可以看上图左子树的最大深度是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
其实本题使用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。我们都可以套用模板来解决这种类型的问题,但是为了能更好的提高自己的算法能能力,博主还是建议大家能够去多多练习的,同时下面也整理了一些习题为大家加餐。
总结
本文也是到了尾声,同时非常感谢能看到这里的小伙伴们,也更希望本文能对你们有所帮助。这个系列—算法模板如果没有什么意外博主是会一直更新下去的,更希望能帮助一下初学的小伙伴们。
每一篇文章都是博主十分用心创作出来的,如果能给大家带来帮助希望大家来个一键三连。这将会是博主最大的动力哦!!!