题目来源: JZ55 二叉树的深度
题目描述:
-
描述: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
- 假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
数据范围: 节点的数量满足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的操作,直到遍历结束,此时便顺利的得到了最大深度.
- 1.既然要使用二叉树的层次遍历,那我们需要考虑到
- 图示:
具体实现:
/**
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 天,点击查看活动详情”