当前位置: 首页 > news >正文

二叉树的最大深度[简单]

在这里插入图片描述

优质博文:IT-BLOG-CN

一、题目

给定一个二叉树root,返回其最大深度。

二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:
输入:root = [1,null,2]
输出:2

树中节点的数量在[0, 104]区间内。
-100 <= Node.val <= 100

二、代码

【1】深度优先搜索: 如果我们知道了左子树和右子树的最大深度lr,那么该二叉树的最大深度即为max(l,r)+1。而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int maxDepth(TreeNode root) {// 递归计算数的深度,确定递归的推出条件if (root == null) {return 0;} else {int leftHight = maxDepth(root.left);int rightHight = maxDepth(root.right);return Math.max(leftHight,rightHight) + 1;}}
}

复杂度分析:
1、时间复杂度: O(n)其中n为二叉树节点的个数。每个节点在递归中只被遍历一次。
2、空间复杂度: O(height)其中height表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

【2】广度优先搜索: 我们也可以用「广度优先搜索」的方法来解决这道题目,但我们需要对其进行一些修改,此时我们广度优先搜索的队列里存放的是当前层的所有节点。每次拓展下一层的时候,不同于广度优先搜索的每次只从队列里拿出一个节点,我们需要将队列里的所有节点都拿出来进行拓展,这样能保证每次拓展完的时候队列里存放的是当前层的所有节点,即我们是一层一层地进行拓展,最后我们用一个变量ans来维护拓展的次数,该二叉树的最大深度即为ans

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}Queue<TreeNode> queue = new LinkedList<TreeNode>();// 先存放root节点queue.offer(root);// 总长度int maxLen = 0;// 开启循环,并确定退出循环的条件while (!queue.isEmpty()) {// 获取当前队列的长度,确定该层遍历的次数int size = queue.size();// 我们需要遍历当前层的所有 treeNode// 确定循环条件,并确定退出条件while (size > 0) {TreeNode treeNode = queue.poll();if (treeNode.left != null) {// 注意:添加的时左节点,而不是当前节点queue.offer(treeNode.left);}if (treeNode.right != null) {queue.offer(treeNode.right);}--size;}++maxLen;}return maxLen;}
}

复杂度分析:
1、时间复杂度: O(n)其中n为二叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。
2、空间复杂度: 此方法空间的消耗取决于队列存储的元素数量,其在最坏情况下会达到O(n)

http://www.lryc.cn/news/287804.html

相关文章:

  • [Redis]不同系统间安装redis服务器
  • Unity之动画和角色控制
  • C语言库函数实现字符串转大小写
  • hcip----ospf
  • vue中如何写过滤器
  • c语言-文件的读写操作(下)
  • android学习笔记----SQLite数据库
  • 开发知识点-Flutter移动应用开发
  • 视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用
  • openssl3.2/test/certs - 061 - other@good.org not permitted by CA1
  • 如何实现无公网ip远程访问本地websocket服务端【内网穿透】
  • pip清华源怎么换回来
  • [Go]认识Beego框架
  • JWT登录
  • MySQL和Redis的事务有什么异同?
  • 【C#】基础巩固
  • 基于Skywalking开发分布式监控(一)
  • 高防服务器什么意思
  • C/C++ - Auto Reference
  • springboot项目快速引入knife4j
  • SpringBlade微服务开发平台
  • 【运维】Ubuntu18.04系统docker方式安装ElasticSearch和kibana
  • 五种单例模式
  • 【ceph】ceph关于清洗数据scrub的参数分析
  • 自然语言NLP学习
  • js实现填涂画板
  • springboot农机电招平台源码和论文
  • TensorFlow 深度学习 开发环境搭建 全教程
  • Qt —— QCharts之曲线示波器(附源码)
  • 【秒剪】如何更换视频画幅比例以及画面背景?