要如何把最大深度求出来呢?
我们可以利用递归方法
首先我们明确递归是不断拆分大问题,解构成小问题把小问题的答案用于构建大问题的答案,通过回溯,实现问题的解答
递归实际上是利用系统栈实现的,保存当前的调用现场去执行子问题,子问题的返回作为现场需要的参数回填,最终还原栈顶现场
这个例子根据递归方法我们知道要想知道根节点的最大深度,要知道3节点的最大深度
要想知道3节点的最大深度又得知道4节点的最大深度
要想知道4节点的最大深度就得知道5节点的最大深度
要想知道5节点的最大深度就得知道6节点的最大深度
6节点的最大深度通过遍历它子节点阔以发现,他的子节点都是空节点所以满足递归停止的条件,返回给上一个问题我的if(root==null)return lev;lev是0,上层6节点看到他的孩子lev是0,自己就变成了两个孩子中较大层数+1,成为了第1层
5节点的左孩子是null也是递归的停止条件就告诉5我是第0层,5的右孩子6告诉5自己是第1层,该节点想了想那我就是他们中最大的层数+1,5得出结论自己是第二层
如此以往,最终头节点发现自己是第五层
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
int level=dfs(0,root);
return level;
}
//递归用到的信息,一个是层数,一个是节点
public int dfs(int lev,TreeNode root){
//递归停止的条件
if(root==null)return lev;
return Math.max(dfs(lev+1,root.left),dfs(lev+1,root.right));
//比较该节点左边和右边深度,比较大的就是最大深度
}
}
Leetcode111 二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
return process(root);
}
public int process(TreeNode root){
if(root==null){//递归停止条件
return 0;
}
int leftheight=process(root.left);//左子树递归调用得到高度
int rightheight=process(root.right);//右子树递归调用得到高度
if(leftheight==0 && rightheight!=0)return ++rightheight;
if(rightheight==0 && leftheight!=0)return ++leftheight;
int height=Math.min(leftheight,rightheight);//高度为左右子树更小的那个高度
return ++height;
}
}
我们发现对比找最大深度的代码找最小深度多了两行代码
if(leftheight==0 && rightheight!=0)return ++rightheight;
if(rightheight==0 && leftheight!=0)return ++leftheight;
去掉这两句行不行?不行,当遇到这种情况会出现错误
他会一直给上层调用反馈左右子树更小的层数,比如5节点,因为他的左孩子为第0层右孩子为第1层,如果不给他加这俩句,5这个节点他就认为什么男人至死是少年以为i自己是0+1第一层,一路往上走都是同理
我们需要这俩句来强迫他成长,看到如果一边高度为0,他不能固执的认为自己是1层,
只有在左右高度都不为0的时候,相当于给他提供了俩选项,他才能选小的那个数自己+1