本题主要的学习重点是理解递归。
题目描述:
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
示例 2:
输入:root = [1,null,2] 输出:2
提示:
- 树中节点的数量在
[0, 104]
区间内。 -100 <= Node.val <= 100
解题准备:
1.了解二叉树:二叉树是递归定义而来,其定义在有限的结点集中,由三个不相交的结点集合组成,分别是根节点、左子树结点和右子树结点。
2.了解可能涉及的基本操作:第一,既然需要得到最大深度,大概率需要遍历所有结点,也就是涉及查找,其余目前看不出来。。总结,大概率有查找。
解题难点1分析:
难点1:对每一个结点,都可能有两个选择。
比如根节点root,无法确定最大深度会在左子树还是右子树。
拆分化简:如果仅求最左链上的深度,如何求?
定义:最左链是指,对每一个结点,都取左子树(左子结点)。【比如图一,就是3->9->null,如果有更多,则另说】
那就非常简单了,首先,树的实现基于链表(其左子、右子甚至可以看成一条链表),所以本题目完全可以看成一条链表。
可以while(root!=null){depth++; root=root.next;}
当然,本化简的目标是学习一种操作:递归。
递归:
递归,用不准确的比喻来理解,就是求解A,需要到B处找答案;求解B,又要到C处找答案;;;这样一直循环下去,直到找到第一个有答案的人【即到达结束条件】,才顺序返回。
对于链式结构,最常见的递归格式如下:
public int f(Type data){
if(data==null){
return 0;
}
return f(data.next);
}
当然,学一个东西不能只学形式,递归的本质,就是把大问题分解成小问题,比如求根节点最左链的深度,其本质就是求根节点左子树的深度+1;;其左子树的深度,就是左子树的左子树的深度+1……直到左子树为null,null树的深度为0,返回0,接着其它数据分步计算,最终得到结果。
难点1思路:
对于本题,每个结点,有两个可能的解。
从二叉树的定义出发,root的左、右子树都是一棵二叉树,那么对于root,root的最大深度,就是左子树、或者右子树的最大深度+1。
当然,这里要判断左子、或者右子树谁更大?
如果用递归的思路,直接就可以得出:根节点root的最大深度,就等于max(左子树,右子树)+1。
定义结束条件:
对于最左链,如果root==null,那么返回0。
对于本题,其实同理,因为将左、右结点都传递过去了,不必担心缺少的问题。
代码:
class Solution {
public int maxDepth(TreeNode root) {
return f(root);
}
private int f(TreeNode root){
if(root==null){ // 如果是null,则返回0
return 0;
}
int l=f(root.left); // 递归查找左子树的最大深度
int r=f(root.right); // 递归查找右子树的最大深度
return Math.max(l, r)+1; // 找到后+1
}
}
以上内容即我想分享的关于力扣热题14的一些知识。
我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。