1.最大深度问题
思路:递归三部曲
第一步:确定参数和返回值
题目要求求二叉树的深度,也就是有多少层,需要传递一个root从底层向上统计
int maxDepth(TreeNode root)
第二步:确定终止条件
当递归到null时就说明到底了,返回0
第三步:确定单层逻辑
一个结点的深度=max(左,右)+1
class Solution {
public int maxDepth(TreeNode root) {
if( root== null){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return 1+Math.max(left,right);
}
}
2.判断平衡二叉树
思路:递归三部曲
第一步:确定参数和返回值
从底向上统计结点高度,int trace(TreeNode root)
第二步:确定终止条件
当递归到空代表触底,当左右结点高度差大于1代表失败直接一路返回-1
否则就是继续向下
第三步:确定单层逻辑
判断有无不平衡现象出现,若无往上返回一层将结点高度+1
class Solution {
public boolean isBalanced(TreeNode root) {
return trace(root)>-1;
}
public int trace(TreeNode root){
if(root == null){
return 0;
}
int left = trace(root.left);
int right = trace(root.right);
if(left == -1 || right == -1 || Math.abs(left - right)>1){
return -1;
}
return 1+Math.max(left,right);
}
}
3.最小深度
思路:递归三部曲
第一步:确定参数和返回值
还是需要遍历结点求深度,需要传入结点返回深度值
int trace(TreeNode root)
第二步:确定终止条件
当遍历到空时就返回0
第三步: 确定单层逻辑
需要注意的是根结点深度为1但不能算到最小深度,如果直接返回1+Min(左,右)就不符合条件
这样就需要避免根结点某一孩子为空情况
- 左结点为空右结点不为空时,返回右结点深度+1
- 右结点为空左结点不为空时,返回左结点深度+1
- 如果都不为空就返回1+Min(左,右)
class Solution {
public int minDepth(TreeNode root) {
return trace(root);
}
public int trace(TreeNode root){
if(root == null){
return 0;
}
int left = trace(root.left);
int right = trace(root.right);
if(root.left==null){
return right+1;
}
if(root.right==null){
return left + 1;
}
return 1+Math.min(left,right);
}
}
4.N叉树的最大深度
思路:递归三部曲
第一步:确定参数和返回值
此题也是求树的深度需要遍历结点,传入结点返回深度值
第二步:确定终止条件
当结点为空返回深度0,当孩子为空返回1,其他就遍历孩子列表挨个求出最大深度
第三步:确定单层逻辑
保存孩子的深度,取最大值
class Solution {
public int maxDepth(Node root) {
if(root == null){
return 0;
}
if(root.children.isEmpty()){
return 1;
}
List<Integer> list = new ArrayList<>();
for(Node node : root.children){
int res = maxDepth(node);
list.add(res);
}
int max = 0;
for(int num : list){
if(num > max){
max = num;
}
}
return 1 + max;
}
}