问题描述
- 给定一个二叉树,找出其最大深度。
- 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
- 说明: 叶子节点是指没有子节点的节点。
示例1:
输入:给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
输出:返回它的最大深度 3 。
题目来源:LeetCode官方
链接地址:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
思路
直接递归遍历,分别获取左子树深度与右子树深度,返回较大的变量即可
核心代码
public static int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
//灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
//这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
//return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
//这个写法就只递归了两次,节省了时间
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return left > right ? left + 1 : right + 1;
}
代码解释
分别获取左子树高度,与右子树高度,然后返回最大的,递归的理解就是将整个二叉树看成三个部分:根结点、左结点、右结点,然后根据题目意思对这三部分做相应处理
运行效果
完整源代码
package com.easy;
public class maxDepth {
public static void main(String[] args) {
/**
* 构建二叉树
* 1
* 2 3
* 4 5 6
*/
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(5);
TreeNode n6 = new TreeNode(6);
TreeNode n2 = new TreeNode(2, n4, n5);
TreeNode n3 = new TreeNode(3, n6, null);
TreeNode root = new TreeNode(1, n2, n3);
System.out.println(maxDepth(root));
System.out.println(count_deep(root));
}
//DFS
public static int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
//灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
//这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
//return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
//这个写法就只递归了两次,节省了时间
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return left > right ? left + 1 : right + 1;
}
//两种写法都差不多
public static int count_deep(TreeNode root) {
if (root == null) return 0;
int left = count_deep(root.left) + 1;
int right = count_deep(root.right) + 1;
return left > right ? left : right;
}
}