代码随想录算法训练营第16天 |(二叉树3 104.二叉树的最大深度 559. N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

二叉树part03

  • 104.二叉树的最大深度 (优先掌握递归)(昨天用层序迭代做过
    • 解题思路
  • 559. N叉树的最大深度
  • 111.二叉树的最小深度 (优先掌握递归)(昨天用层序迭代做过
    • 解题思路
  • 222.完全二叉树的节点个数(优先掌握递归)(需复习
    • 解题思路(要了解完全二叉树的特性,基于此特性求解才有意义

104.二叉树的最大深度 (优先掌握递归)(昨天用层序迭代做过

什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。
大家 要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。
题目链接:104.二叉树的最大深度
文章讲解/视频讲解:104.二叉树的最大深度

解题思路

求高度:后序遍历 根节点的高度就是这棵二叉树的最大深度
求深度:前序遍历
递归三部曲:

  1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
  2. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。
  3. 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
 // 递归  优先掌握
class Solution {public int maxDepth(TreeNode root) {if(root == null){return 0;}int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
}
 // 层序遍历 迭代
class Solution {public int maxDepth(TreeNode root) {int res = 0;Deque<TreeNode> que = new LinkedList<>(); //辅助队列if (root == null) {return res;}que.offer(root);  // 根节点入队while (!que.isEmpty()) {int len = que.size();for(int i = 0; i < len; i++) {TreeNode peek = que.poll(); //当前层元素依次出队// 下一层元素入队if (peek.left != null) que.offer(peek.left);if (peek.right != null) que.offer(peek.right);}res++;            }return res;}
}

559. N叉树的最大深度

题目链接:559. N叉树的最大深度

// 递归
class Solution {public int maxDepth(Node root) {if(root == null) return 0;int ans = 0;for(Node node : root.children){ans = Math,math(ans, maxDepth(node));}        return ans + 1;}
}
// 层序迭代
class Solution {public int maxDepth(Node root) {if(root == null) return 0;int ans = 0;Deque<Node> d = new ArrayDeque<>();d.addLast(root);while(!d.isEmpty()){int size = d.size();while(size-- > 0){Node t = d.pollFirst();for(Node node : t.children){d.addLast(node);}}ans++;}return ans;}
}

111.二叉树的最小深度 (优先掌握递归)(昨天用层序迭代做过

先看视频讲解,和最大深度 看似差不多,其实 差距还挺大,有坑。
题目链接:111.二叉树的最小深度
文章讲解/视频讲解:111.二叉树的最小深度

解题思路

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点。什么是叶子节点,左右孩子都为空的节点才是叶子节点! 求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
递归三部曲:

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层遍历的逻辑(和上道题求最大深度有很大不同,我们要明确何为叶子节点
 //递归  后序遍历
class Solution {public int minDepth(TreeNode root){if (root == null) {return 0;}int leftDepth = minDepth(root.left);int rightDepth = minDepth(root.right);// 当一个左子树为空,右不为空,这时并不是最低点if(root.left == null && root.right != null){return rightDepth + 1;}// 当一个右子树为空,左不为空,这时并不是最低点if(root.left != null && root.right == null){return leftDepth + 1;}return Math.min(leftDepth, rightDepth) + 1;        }
}
// 层序 迭代
class Solution {public int minDepth(TreeNode root){if (root == null) {return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()){int size = queue.size();depth++;TreeNode cur = null;for (int i = 0; i < size; i++) {cur = queue.poll();//如果当前节点的左右孩子都为空,直接返回最小深度if (cur.left == null && cur.right == null){return depth;}if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}}return depth;}
}

222.完全二叉树的节点个数(优先掌握递归)(需复习

需要了解,普通二叉树 怎么求,完全二叉树又怎么求
题目链接:222.完全二叉树的节点个数
文章讲解/视频讲解:222.完全二叉树的节点个数

解题思路(要了解完全二叉树的特性,基于此特性求解才有意义

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

// 递归 后序遍历  利用二叉树的性质  这种要掌握
class Solution {public int countNodes(TreeNode root) {if(root == null) return 0;TreeNode left = root.left;TreeNode right = root.right;int leftDepth = 0, rightDepth = 0;while(left != null){  // 求左子树深度left = left.left;leftDepth++;}while(right != null){ // 求右子树深度right = right.right;rightDepth++;}if (leftDepth == rightDepth) {return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0}return countNodes(root.left) + countNodes(root.right) + 1;}
}
// 按普通二叉树进行递归
class Solution {// 通用递归解法public int countNodes(TreeNode root) {if(root == null) {return 0;}return countNodes(root.left) + countNodes(root.right) + 1;}
}
// 用昨天讲过的层序迭代
//感觉这种最好理解
class Solution {public int countNodes(TreeNode root) {Deque<TreeNode> que = new LinkedList<>(); //辅助队列int num = 0;if (root == null) {return num;}que.offer(root);  // 根节点入队while (!que.isEmpty()) {int len = que.size();for(int i = 0; i < len; i++) {TreeNode peek = que.poll(); //当前层元素依次出队num++;// 下一层元素入队if (peek.left != null) que.offer(peek.left);if (peek.right != null) que.offer(peek.right);}}return num;}
}

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

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

相关文章

人工智能在银行支付领域的应用场景与发展建议

人工智能在银行支付领域的应用场景与发展建议 随着科技的不断进步和金融行业的发展&#xff0c;人工智能&#xff08;AI&#xff09;在银行支付领域的应用正日益广泛。AI技术可以通过数据分析和智能算法&#xff0c;提升支付系统的效率、安全性和用户体验。以下是人工智能在银…

易经占卜中的人工智能思想:先随机有一个答案不管正确与否 等后期积累经验再完善,答案就会越来越准确好用

《易经》&#xff1a;研究变化&#xff0c;平衡&#xff0c;对不确定性、复杂性处理、动态适应以及系统性决策 《易经》&#xff08;又称《周易》&#xff09;是中国古代的一部哲学经典&#xff0c;主要讨论的是宇宙和生活中的变化规律。它不仅仅是一部占卜书籍&#xff0c;更…

【YOLO系列】 YOLO V4之正则化DropBlock

资料下载 论文下载&#xff1a;DropBlock: A regularization method for convolutional networks 一、简介 DropBlock是一种正则化技术&#xff0c;用于防止深度神经网络的过拟合。它通过在训练过程中随机丢弃网络中的一部分特征图&#xff0c;来增加模型的泛化能力。 文章中分…

在微信公众号上怎么实现拼团功能

拼团魅力&#xff1a;微信公众号上的拼团功能如何助力营销 一、引言 在这个数字化时代&#xff0c;微信公众号成为了企业与消费者互动的重要平台。而拼团功能作为微信营销的一大利器&#xff0c;为企业带来了巨大的商业价值。那么&#xff0c;如何在微信公众号上实现拼团功能&…

gseaplot3修改一下clusterProfiler默认绘图函数

直接使用clusterProfiler::gseaplot2绘图会出现下边的结果&#xff0c;导致四周显示不全&#xff0c;线的粗细也没办法调整&#xff0c;因为返回的是一个aplot包中的gglist对象&#xff0c;没太多研究。 p1 <- clusterProfiler::gseaplot2(gsea_result, gsea_result$ID, pv…

JavaScript初见

书写位置 和css差不多 行内script标签内script所引的js文件 输入输出语句 输入 prompt();输出 console();// 控制台显示 alert();//弹出框 alert(字符串 变量 ’\n‘);变量 声明 var neme 原神; var tele 1;不用管类型&#xff0c;真不错啊 **js中变量的声明不需…

Logback框架基本认识

文章目录 一.什么是Logback1.1 初识Logbcak 二.Logbcak的结构三.日志的级别四.配置组件详解4.1 logger 日志记录器属性的介绍如何在配置文件里配置 4.2 appender 附加器 配合日志记录器的输出格式4.2.1 控制台附加器4.2.2 文件附加器4.3.3滚动文件附加器 4.3 Filter: 过滤器&am…

记录一次应用服务响应慢问题排查过程

3个自建系统使用了一个统一的外部系统接入服务&#xff0c;该服务主要是统一处理外部系统对接&#xff0c;处理掉数据鉴权等问题&#xff0c;提供内部鉴权接口给自己的服务使用。类似一个对接网关。 问题背景 研发反应&#xff0c;后端接口请求时快时慢&#xff0c;影响演示效…

21.正则表达式

正则表达式 文章目录 正则表达式1. 正则表达式分类2. 基本正则表达式3. 扩展正则表达式 1. 正则表达式分类 正则表达式&#xff1a;REGEXP&#xff0c;REGular EXPression。 正则表达式分为两类&#xff1a; Basic REGEXP&#xff08;基本正则表达式&#xff09;Extended REG…

【MATLAB】快速绘制曲线图的形状,粗细,颜色

目录 MATLAB 快速绘制曲线图的形状&#xff0c;粗细&#xff0c;颜色 1.通过改变R-G-B 的值改变线条的颜色&#xff1a;2.通过改变c∈[1,∞)的值改变线条的粗细&#xff1a;3.线条形状&#xff0c;粗细&#xff0c;颜色选择&#xff1a;4.Matlab中画图实现案例&#xff1a; MA…

js封装根据年月日获取星座效果demo(整理)

//根据年月日获取星座 function getZodiacSign(dateString) {// 用法:const dateStr 2024-01-11;// const zodiacSign getZodiacSign(dateStr);const date new Date(dateString);const month date.getMonth() 1;const day date.getDate();if ((month 1 && day &…

Python教程39:使用turtle画美国队长盾牌

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

HTML date类型数前后端互传,页面显示date类型

springMVCthymeleafHTML(date) 1.实体类定义字段为date类型 private Date bizdate;2.前端HTML中input的date类型 <div class"form-group"><label for"bizdate">请输入交易日期</label><input type"date" class"form…

Edge浏览器设置自动刷新

1. 使用浏览器扩展 你可以在 Edge 的扩展商店中搜索并安装这些扩展。以下是一些常见的扩展&#xff1a; Super Auto Refresh: 提供了强大的自动刷新功能&#xff0c;可以根据自定义的时间间隔进行刷新。 Auto Refresh: 允许你设置页面刷新的间隔。 2. 使用开发者工具&#xff1…

【uview2.0】Keyboard 键盘 与 CodeInput 验证码输入 结合使用 uview

https://www.uviewui.com/components/codeInput.html &#xff08;CodeInput 验证码输入&#xff09; https://www.uviewui.com/components/keyboard.html &#xff08;Keyboard 键盘&#xff09; <u-keyboard mode"number" :dotDisabled"true" :show&q…

一体式气象站的优点是什么?带大家了解一下

一体式气象站是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。 一体式气象站的优点主要体现在以下几个方面&#xff1a; 集成度高&#xff1a;一体式气象站集成了多种气象传感器、数据处理单元、显示单元和通讯模块等&#xff0c;可以同时监…

2019年认证杯SPSSPRO杯数学建模B题(第一阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于方差分布的方法对未知语言文本中重复片段的自动搜索问题的研究 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但…

2024年【熔化焊接与热切割】考试内容及熔化焊接与热切割免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试内容是安全生产模拟考试一点通总题库中生成的一套熔化焊接与热切割免费试题&#xff0c;安全生产模拟考试一点通上熔化焊接与热切割作业手机同步练习。2024年【熔化焊接与热切割】考试内容及熔化…

golang学习-map

1、map定义 一种无序的基于key-value的数据结构&#xff0c;是引用类型&#xff0c;必须初始化才能使用。默认初始值是nil。 2、map声明 func main() {//map 定义第一种写法 make()userInfo : make(map[string]string)userInfo["age"] "20"fmt.Println…

ceph、gluster、longhorn选型对比

Ceph Ceph是一个分布式的存储系统&#xff0c;可以在统一的系统中提供唯一的对象、块和文件存储。 名词解释&#xff1a; RADOS&#xff1a; 由自我修复、自我管理、智能存储节点组成的可靠、自主、分布式对象存储LIBRADOS&#xff1a; 一个允许应用程序直接访问 RADO 的库&…