算法-二叉树-简单-二叉树的最大和最小深度

记录一下算法题的学习7

二叉树的最大深度

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

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

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

示例分析:

这里根节点为3,叶子节点是什么呢?---->是指没有子节点的节点,记录从根节点到最远叶子节点的最长路径上的节点数,那么就是3-20-15,或者3-20-7,一共是3个节点数

怎么体现呢?

深度优先搜索代码展示:

class Solution {public int maxDepth(TreeNode root) {//首先输入根节点为空的情况下,二叉树就不存在  if(root==null){return 0;}//判断输入根节点不为空,存在二叉树else{int leftDepth=maxDepth(root.left); //得到根节点root左子树的最长路径上的节点数int rightDepth=maxDepth(root.right);//得到根节点root右子树的最长路径上的节点数return Math.max(leftDepth,rightDepth)+1;//由题目可知,还需加上代表根节点的节点数1}}
}

广度优先搜索代码展示:

这里进行回忆记录Queue?

  • Queue是java中实现队列的接口,它总共有6个方法,我们一般只用其中3个就可以了。
  • Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。

方法

作用区别

add()

压入元素(添加)相同:未超出容量,从队尾压入元素,返回压入的那个元素。
区别:在超出容量时,add()方法会对抛出异常,offer()返回false
offer()压入元素(添加)
remove()弹出元素(删除)相同:容量大于0的时候,删除并返回队头被删除的那个元素。
区别:在容量为0的时候,remove()会抛出异常,poll()返回false
poll()弹出元素(删除)
element()获取对头元素相同:容量大于0的时候,都返回队头元素。但是不删除。
区别:容量为0的时候,element()会抛出异常,peek()返回null。
peek()获取对头元素
class Solution {public int maxDepth(TreeNode root) {//首先输入根节点为空的情况下,二叉树就不存在  if(root==null){return 0;}Queue<TreeNode> queue=new LinkedList<>();//初始化队列queuequeue.offer(root);//将根节点加入队列中int result=0;//初始化结果while(!queue.isEmpty()){ //队列不为空的情况,即刚才加入的根节点!=nullint size=queue.size();//取出当前队列的长度while(size-->0){//取出相同数量的节点数进行遍历TreeNode node=queue.poll();if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}result++; }return result;}
}

二叉树的最小深度

题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

输入:root = [3,9,20,null,null,15,7]
输出:2
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

示例分析:

如果我们直接将二叉树的最大深度的代码,直接拿来用,就会报错,因为我们忽略了还有一种情况(左孩子和右孩子有一个为空的情况,但不确定是哪一个,我们返回leftDepth+rightDepth+1)在求二叉树的最小深度中。

 深度优先搜索代码展示:

class Solution {public int minDepth(TreeNode root) {//首先输入根节点为空的情况下,二叉树就不存在  if(root==null){return 0;}//1.左孩子和右孩子都为空的情况,说明到达了叶子节点,直接返回1if(root.left == null && root.right == null){return 1;}int leftDepth=minDepth(root.left); //得到根节点root左子树的最短路径上的节点数int rightDepth=minDepth(root.right);//得到根节点root右子树的最短路径上的节点数//2.左孩子和右孩子有一个为空的情况,但不确定是哪一个,我们返回leftLength+rightLength+1if(root.left == null || root.right == null){return leftDepth+rightDepth+1;//3 左孩子和右孩子都不为空的情况,那就比较出两者之间更小的值,然后再加一,得到最小深度}else{return Math.min(leftDepth,rightDepth)+1;//由题目可知,还需加上代表根节点的节点数1} }
}

广度优先搜素代码展示:

class Solution {public int minDepth(TreeNode root) {//首先输入根节点为空的情况下,二叉树就不存在  if(root==null){return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int result=1;while (!queue.isEmpty()) {int size=queue.size();for(int i=0;i<size;i++){TreeNode node =queue.poll();if (node.left == null && node.right == null) {return result;}if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}result++;}return result;}
}

注意这里必须这样写

不能直接写成for(int i=0;i<queue.size();i++),因为queue.size()一直在变化,加入一个就变化一次,无法完成每次循环遍历每层内容,但是可以写成for(int i=queue.size()-1;i>=0;i--)。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法

系列文章目录 文章目录 系列文章目录前言一、相关函数 —— LQG/LQR 和极点配置算法1.1 LQR —— lqr 函数1.1.1 函数用法1.1.2 举例1.1.2.1 倒摆模型的 LQR 控制 1.2 LQG —— lqg() 函数1.2.1 函数用法1.2.2 举例 1.3 极点配置 —— place() 函数1.3.1 函数用法1.3.2 示例1.3…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

如何使用ffmpeg将FLAC格式转为MP3格式

以下是使用ffmpeg将FLAC格式转换为MP3的方法&#xff1a; 单个文件转换&#xff1a; ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3 其中&#xff0c;input.flac是要转换的FLAC文件名&#xff0c;output.mp3是转换后的MP3文件名。-ab 320k表示…

如何在虚拟机的Ubuntu22.04中设置静态IP地址

为了让Linux系统的IP地址在重新启动电脑之后IP地址不进行变更&#xff0c;所以将其IP地址设置为静态IP地址。 查看虚拟机中虚拟网络编辑器获取当前的子网IP端 修改文件/etc/netplan/00-installer-config.yaml文件&#xff0c;打开你会看到以下内容 # This is the network conf…

Vue中的组件间通信有哪些方式?

Vue中实现组件间通信的方式非常多样&#xff0c;以下是一些常用的方式&#xff1a; Props / $emit&#xff1a;这是最常用的组件通信方式&#xff0c;父组件通过属性向子组件传递数据&#xff0c;子组件通过事件向父组件传递数据。Ref / $refs&#xff1a;这是一种访问子组件或…

面向开发者的Android

Developerhttps://developer.android.google.cn/?hlzh-cn SDK 平台工具版本说明https://developer.android.google.cn/studio/releases/platform-tools?hlzh-cn#revisions Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具…

【Redis】springboot整合redis(模拟短信注册)

要保证redis的服务器处于打开状态 上一篇&#xff1a; 基于session的模拟短信注册 https://blog.csdn.net/m0_67930426/article/details/134420531 整个流程是&#xff0c;前端点击获取验证码这个按钮&#xff0c;后端拿到这个请求&#xff0c;通过RandomUtil 工具类的方法生…

dm 聚合函数和group的总结

-- dm&#xff1a;select中只能为group字段&#xff0c;聚合函数&#xff1b;不能有其他内容 select id,user_id,role_id from assets_dm_test.user_role GROUP by role_id; -- mysql: ok 执行ok&#xff0c;但是语法有问题&#xff0c;多条时只显示了第一条 sel…

nginx得if语句内proxy_pass不允许携带url部分,如何处理

在nginx中&#xff0c;proxy_pass指令不能直接携带URL部分。但是&#xff0c;可以使用rewrite指令结合正则表达式来处理URL部分。 下面是一个示例配置&#xff0c;演示如何使用rewrite指令将URL中的某个部分进行替换后传递给后端服务器&#xff1a; location /v100/{proxy_…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven依赖管理,版本号管理,继承和聚合

第一章 Maven的依赖管理 1.1 依赖范围 依赖语法&#xff1a;<scope> compile【默认值】&#xff1a;在main、test、Tomcat【服务器】下均有效。test&#xff1a;只能在test目录下有效 junit provided&#xff1a;在main、test下均有效&#xff0c;Tomcat【服务器】无效…

Labview中for循环“无法终止”问题?即使添加了条线接线端,达到终止条件后,仍在持续运行?

关键&#xff1a; 搞清楚“运行”和“连续运行”两种运行模式的区别。 出现题目中所述问题&#xff0c;大概率是因为代码运行在“连续运行“模式下。 可以通过添加 探针 的方式&#xff0c;加深理解&#xff01;

拼图游游戏代码

一.创建新项目 二.插入图片 三.游戏的主界面 1.代码 package com.itheima.ui;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random;import javax.swing…

pnpm : 无法加载文件 E:\Soft\PromSoft\nodejs\node_global\pnpm.ps1,

pnpm : 无法加载文件 E:\Soft\PromSoft\nodejs\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中 的 about_Execution_Policies。 所在位置 行:1 字符: 1pnpm -v~~~~ CategoryI…

数据结构【DS】栈的应用

描述一下如何实现括号匹配&#xff1f; 初始时栈为空。 从左往右遍历算术表达式中的每个括号元素&#xff1a; ①当遍历到左括号时&#xff0c;将其压入栈顶。 ②当遍历到右括号时&#xff0c;将栈顶元素出栈&#xff0c;并判断出栈的左括号与当前遍历的右括号是否匹配&…

杭电oj 2050 折线分割平面 C语言

#include<stdio.h>void main() {int c, n, i;long long sum;while (~scanf_s("%d", &c)){while (c--){scanf_s("%d", &n); sum 0;sum 2 * n * n - n 1;printf("%lld\n", sum);}} }

Django 入门学习总结6 - 测试

1、介绍自动化测试 测试的主要工作是检查代码的运行情况。测试有全覆盖和部分覆盖。 自动测试表示测试工作由系统自动完成。 在大型系统中&#xff0c;有许多组件有很复杂的交互。一个小的变化可能会带来意想不到的后果 测试能发现问题&#xff0c;并以此解决问题。 测试驱…

FPGA实现平衡小车(文末开源!!)

FPGA平衡小车 一. 硬件介绍 底板资源: TB6612电机驱动芯片 * 2 MPU6050陀螺仪 WS2812 RGB彩色灯 * 4 红外接收头 ESP-01S WIFI 核心板 微相 A7_Lite Artix-7 FPGA开发板 电机采用的是平衡小车之家的MG310(GMR编码器)电机。底板上有两个TB6612芯片&#xff0c;可以驱动…

【C/PTA】数组进阶练习(三)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 数组-排名查询7-2 数组-人数过半7-3 数组-数值插入7-4 数组-冒泡排序7-5 数组-删除元素7-6 数组-歌手得分7-7 数组-前K个成绩7-8 数组-…

TypeScript使用@来映射文件路径解决找不到模块“@/xxx”或其相应的类型声明的问题

TypeScript 使用 来映射文件路径解决找不到模块“/xxx”或其相应的类型声明的问题 环境&#xff1a;Vue3 Vite ts 想便捷引用自定义模块 由于在script中使用import { login } from "../../../net";这用每次都要查文件夹层数&#xff0c;所以想用直接映射src目录更…