听不少大佬建议过——力扣刷题要从树开始 !
因为可以建立起套路化的思路~ 另外就是锻炼好递归的思想
所以 我们从树开始~
本专题采用 前面提到的 “兔系刷题法”
不求钻研多种解法 只求快速见题型快速刷题!
另外 力扣评论区里看见的——
树的题目写不出来,多背几个模版就行。
前中后序、广度深度遍历、路径和、深度,直径,这些全部背下来。
感觉很有道理!多背些多理解些套路嘛!
本专题整理了tag中包括深度优先搜索的题
感觉树的问题中 有一大部分都是使用深度优先搜索的思路进行解题!
掌握套路和思想对解题很有好处呐!
这里挑选了比较火爆的几道题
之后如果遇到 再收录进来吧
文章目录
啥是深度优先搜索算法?
借用力扣官方给出的概念解释——
深度优先搜索是一种用于遍历或搜索树或图的算法
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止 且每个节点只能访问一次回溯算法是基于深度优先搜索的
可以说 回溯算法是深度优先搜索算法DFS的一种 之后还会去刷回溯算法嗷~
我的理解是
先深入到最深处寻找答案
如果没找到就退回去换一条路再走到最深处去找
直到找到答案为止
搞不懂的话 可以看看这篇文章 前面的例子举得挺好的
后面的代码可以忽略哈~
104.二叉树的最大深度 easy
上个专题这个求深度的题就是使用DFS的方法进行求解的
递归
深度优先搜索 DFS
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解题思路
【1】自顶向下
具体思路就是
一层一层地进行搜索
每搜索新的一层 深度
depth
就+1
到最底下更新一下
ans
【2】自底向上
这个方法之前写过一篇博客
简单画了一下这个寻找depth值
的过程 刚好吻合~
发现叶子节点 ------ return 0 + 1
这个 0 + 1
就是父节点的 Ldepth
(看下面的代码)
然后再慢慢往上倒就行了~
如果有上一层 ------ return Math.max(1, Rdepth) + 1
再往上同理
递归 自顶向下
关键是计算深度方法 public void _maxDepth(TreeNode root, int depth)
class Solution {
public int ans = 0;
public void _maxDepth(TreeNode root, int depth) {
if (root == null) return;
if (root.left == null && root.right == null){
ans = Math.max(ans, depth);//到最底下更新一下 ans
}
_maxDepth(root.left, depth + 1);//逐层的深入 每进入新的一层 就把深度加一~
_maxDepth(root.right, depth + 1);//左边深入完 再来深入右边~
}
public int maxDepth(TreeNode root){
_maxDepth(root, 1);
return ans;
}
}