算法通关村第七关——白银挑战笔记
前言
全文代码均以Java语言复现,主要为自己学习做记录,如有问题,还请各位大佬们指点指点。
这篇讲解二叉树递归问题。
树的深度和高度
这个算是一谈到树,比不能绕开的话题,这里我是直接从1 开始,即根节点的深度为1。大家可以参考这个博客~
树的高度和深度的区别
题目
leetcode 111——最小深度
传送门
其实,一谈到递归,核心难点,就是关于边界条件的确定,一旦确定,其实代码就显得非常优雅和简洁,相对于广度搜索,因此掌握递归,深度优先搜索也是掌握了大半了。
因此,这道的题的边界值是什么呢?我们来分析一下。
二叉树深度——根节点从叶子节点的简单的边数,从上往下数,从一开始。
边界条件:
1. 根节点为空 直接返回0
2. 叶子节点 直接放回1
3. 左右子树其中一个为空时,求解最小深度+ 1(因为是从一开始)
其中1和2的边界情况,我们称之为特殊返回值,3是叠加返回值(也是最核心的递归表达式)
代码
这里两种编码方式,不过思路都是一样,都是确实边界情况,进行递归表达式的编写
第一种
public int minDepth(TreeNode root) {
// 终止条件
if(root == null){
return 0;
}
// 叶子结点
if(root.left == null && root.right == null){
return 1;
}
int p1 = minDepth(root.left);
int p2 = minDepth(root.right);
// 左右孩子其中有一个为空的情况
if(root.left == null || root.right == null){
// 既然有一个为空 那么 p1或者p2 是0的
return p1 + p2 + 1;
}
return Math.min(p1,p2) + 1;
}
第二种
public int minDepth(TreeNode root) {
// 递归的终止条件
// 1. 特殊边界
if(root == null) {
return 0;
}
if(root.left == null && root.right == null){
return 1;
}
int min = Integer.MAX_VALUE;
// 左子树不为空时
if(root.left != null){
// 查找最小深度
min = Math.min(minDepth(root.left) + 1,min);
}
// 右子树不为空时
if(root.right != null){
min = Math.min(minDepth(root.right) + 1 ,min);
}
// 叶子结点返回
// 因为都不满足root.left != null 和 root.right != null
return min;
}