描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足 0 \le n \le 1000≤n≤100 ,节点上的值满足 0 \le val \le 1000≤val≤100
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
题源:二叉树的深度_牛客题霸_牛客网 (nowcoder.com)
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
示例1
输入:
{1,2,3,4,5,#,6,#,#,7}
返回值:
4
示例2
输入:
{}
返回值:
0
思路:
最大深度是所有叶子节点的深度的最大值,深度是指树的根节点到任一叶子节点路径上节点的数量,因此从根节点每次往下一层深度就会加1。因此二叉树的深度就等于根节点这个1层加上左子树和右子树深度的最大值,即而每个子树我们都可以看成一个根节点,继续用上述方法求的深度,于是我们可以对这个问题划为子问题,利用递归来解决:
- 终止条件: 当进入叶子节点后,再进入子节点,即为空,没有深度可言,返回0.
- 返回值: 每一级按照上述公式,返回两边子树深度的最大值加上本级的深度,即加1.
- 本级任务: 每一级的任务就是进入左右子树,求左右子树的深度。
具体做法:
- step 1:对于每个节点,若是不为空才能累计一次深度,若是为空,返回深度为0.
- step 2:递归分别计算左子树与右子树的深度。
- step 3:当前深度为两个子树深度较大值再加1。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public static int TreeDepth(TreeNode root) {
if (root == null)return 0;
return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
}
}
- 时间复杂度:O(n),其中n为二叉树的节点数,遍历整棵二叉树
- 空间复杂度:O(n),最坏情况下,二叉树化为链表,递归栈深度最大为n