Day28: 二叉树的深度

132 阅读2分钟

描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 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