听不少大佬建议过——力扣刷题要从树开始 !
因为可以建立起套路化的思路~ 另外就是锻炼好递归的思想
所以 我们从树开始~
本专题采用 前面提到的 “兔系刷题法”
不求钻研多种解法 只求快速见题型快速刷题!
另外 力扣评论区里看见的——
树的题目写不出来,多背几个模版就行。
前中后序、广度深度遍历、路径和、深度,直径,这些全部背下来。
感觉很有道理!多背些多理解些套路嘛!
本期选取了一道我非常耐的题
来细扣一下递归的这些个小套路~
【图片源自b站 迷糊老师】hhh
不废话 先来看题
题目中的“自底向上” "自顶向下”在下面会进行一个详解
文章目录
2021.6.25 更新 leetcode110 平衡二叉树 练一下吧朋友们 一模一样的思路
本文食用建议
- 打开104. 二叉树的最大深度
- 打开本文
用个30-60min 把这题以及相关方法整明白
啥?时间不够?收藏下慢慢看呗[doge]
另外有什么相关题你做到的时候想到这个小套路了?
评论区见!
(之后我要是遇到可以用这类方法解决的题目 会更新进来的~)
104.二叉树的最大深度
递归
深度优先搜索 DFS
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解题思路
【1】自顶向下
21.6.26更新 这里注意 自顶向下 对于同一个节点,
递归函数会被重复调用,导致时间复杂度较高 为O(N)
具体思路就是
一层一层地进行搜索
每搜索新的一层 深度
depth
就+1
到最底下更新一下
ans
【2】自底向上
21.6.26更新 这里注意 自底向上 注意这个方法是“提前阻断”的
也就是说 一旦碰到了不满足平衡二叉树的节点 就会进行“剪枝” (子节点剪掉的话 父节点同样剪掉)
这个方法之前写过一篇博客
简单画了一下这个寻找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