day28 JZ55 二叉树的深度(Java)

115 阅读2分钟

题目来源: JZ55 二叉树的深度

题目描述:

  • 描述: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。

    • 假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
    • DFDBE52B6C61F8021FC86EB0779848B1.png 数据范围: 节点的数量满足0≤n≤100 ,节点上的值满足0≤val≤100 进阶: 空间复杂度O(1) ,时间复杂度O(n)
示例1:
输入:{1,2,3,4,5,#,6,#,#,7}
返回值:4

示例2:
输入:4
输出:0

思路:队列

  • 知识点:队列 思路:
    • 对于统计二叉树的最大深度,我们很直观的就能想到可以对层数进行统计,对于二叉树而言,每层就是一个深度,可以使用二叉树的层次遍历,而层次遍历是从上到下、从左到右,我们只需要统计层数就可以得到深度了
  • 具体做法:
    • 1.既然要使用二叉树的层次遍历,那我们需要考虑到每一层遍历结束后,如何进入下一层,此时就需要用到队列了,队列有一个先进先出的特点,与层次遍历的每一层从左到右相结合,那正好从队列出来的元素顺序就是层次遍历元素的顺序
    • 2.对于二叉树而言,假设某一层的节点数是n,那么队列中此时前n个元素对应的就是该层的n个节点数,因此,遍历的时候,每一层首先要对该层的节点数进行统计,然后遍历相应的节点数后,进入下一层
    • 3.再遍历每一层之后,就对深度进行+1的操作,直到遍历结束,此时便顺利的得到了最大深度.
  • 图示: 3B5A6883A44EDAD8E2563E74BB4C2846.gif

具体实现:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
public class Solution {
    public int TreeDepth(TreeNode root) {
        //空节点没有深度
        if(root == null)
            return 0;
        //队列维护层次后续节点
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        //根入队
        q.offer(root);
        //记录深度
        int res = 0;
        //层次遍历
        while(!q.isEmpty()){
            //记录当前层有多少节点
            int n = q.size();
            //遍历完这一层,再进入下一层
            for(int i = 0; i < n; i++){
                TreeNode node = q.poll();
                //添加下一层的左右节点
                if(node.left != null)
                    q.offer(node.left);
                if(node.right != null)
                    q.offer(node.right);
            }
            //深度加1
            res++;
        }
        return res;
    }
}

  • 复杂度分析:
    • 时间复杂度O(n),其中n为二叉树的节点数,遍历整棵二叉树
    • 空间复杂度O(n),辅助队列的空间最坏为n

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情