一、题目描述
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
示例 2:
输入:root = [1,null,2] 输出:2
提示:
- 树中节点的数量在
[0, 10^4]
区间内。 -100 <= Node.val <= 100
二、解题思路
这个问题是求二叉树的最大深度,可以通过递归的方式来解决。递归的基本思路是,对于树的每个节点,它的深度等于其左右子树的最大深度加1。如果节点为空,则其深度为0。因此,我们可以定义一个递归函数,用于计算每个节点的深度。
算法步骤:
- 如果根节点为空,返回深度为0。
- 计算左子树的最大深度。
- 计算右子树的最大深度。
- 根节点的最大深度等于左右子树的最大深度中的较大者加1。
- 返回根节点的最大深度。
三、具体代码
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 递归函数
maxDepth
对每个节点只调用一次,且每次调用所做的操作是常数时间的(比较左右子树的深度,并加1)。 - 假设树中有n个节点,那么
maxDepth
会被调用n次。 - 因此,总的时间复杂度是O(n),其中n是树中节点的数量。
2. 空间复杂度
- 空间复杂度主要取决于递归调用栈的深度,这通常与树的高度h有关。
- 在最坏的情况下,树是完全不平衡的,例如每个节点都只有左子节点或者只有右子节点,此时树的高度等于节点的数量,空间复杂度为O(n)。
- 在最好的情况下,树是完全平衡的,此时树的高度为log(n),空间复杂度为O(log n)。
- 因此,空间复杂度在O(log n)到O(n)之间,取决于树的形状。
综上所述,代码的时间复杂度是O(n),空间复杂度在O(log n)到O(n)之间,取决于树的形状。
五、总结知识点
-
递归:代码使用了递归的方式来计算二叉树的最大深度。递归是一种常用的算法技巧,它将问题分解为更小的子问题(在这个例子中是左右子树的最大深度),并通过函数自身调用来解决这些子问题。
-
二叉树:代码操作的是二叉树数据结构,二叉树是一种基础的数据结构,每个节点最多有两个子节点,即左子节点和右子节点。
-
递归的基本情况:递归函数通常有一个基本情况(base case),即递归退出的条件。在这个问题中,基本情况是当节点为空时,返回深度为0。
-
数学运算:代码使用了
Math.max
函数来比较左右子树的深度,并取其较大值。 -
函数返回值:
maxDepth
函数返回一个整数,表示二叉树的最大深度。 -
节点定义:代码中使用了
TreeNode
类来定义二叉树的节点,每个节点包含一个整数值和指向左右子节点的引用。 -
类型转换:在递归调用中,
maxDepth
函数的返回值被隐式转换为整数类型。 -
递归调用栈:递归函数的调用会形成调用栈,用于存储每一层递归调用的局部变量和返回地址。
-
树的高度与深度:在二叉树中,根节点的深度为1,每个子节点的深度是其父节点深度加1。树的高度是从根节点到最远叶子节点的最长路径上的节点数。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。