【算法练习Day14】二叉树的最大深度二叉树的最小深度完全二叉树的节点个数

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 二叉树的最大深度
  • 二叉树的最小深度
  • 完全二叉树的节点个数
  • 总结:

先看第一题,求二叉树的最大深度

二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)
在这里插入图片描述

这道题的思路主要有两种,第一种是正常求解二叉树的最大深度,即从上至下搜索,二叉树最大深度的定义是从根节点到叶子节点的最远距离为二叉树的最大深度。我们可以按照前序遍历的方法向下遍历,依次统计出到叶子结点的距离,取最大值即可。

第二种思路是由于二叉树的最大高度就是二叉树的最大深度,所以可以采用求二叉树最大高度的方法求解出本题,高度是逐渐变小的从根节点到叶子节点,这是它和直接求深度的本质区别,这个时候我们可以以后序遍历的方法来从上到下求取最大高度,完成求解。

先给出正常逻辑求深度的代码

class Solution {
public:
int result=0;
void dfs(TreeNode*root,int deepth){result=result>deepth?result:deepth;if(root->left)dfs(root->left,deepth+1);if(root->right)dfs(root->right,deepth+1);}int maxDepth(TreeNode* root) {if(root==NULL)return 0;dfs(root,1);return result;}
};

下面的是以求高度的思路写出的代码

class Solution {
public:int maxDepth(TreeNode* root) {if(root==nullptr){return 0;}int leftval=maxDepth(root->left);int rightval=maxDepth(root->right);int max1=1+max(leftval,rightval);return max1;}
};

两种思路中我更偏向于按照深度的思路,这种思路我觉得更利于理解。

二叉树的最小深度

111. 二叉树的最小深度 - 力扣(LeetCode)
在这里插入图片描述

这道题是求解二叉树的最小深度,如果按照直接求深度的思想写代码思路相差的并不多。只有一点需要注意,并不是直接取deepth和result中的最小值,因为那样直接去取最小值,会出现当根节点一开始左子树或右子树有一个没有的情况时,会直接使result附上结果为1的答案,但是实际上这与二叉树的深度定义本身是不相符合的,深度的定义是根节点到叶子结点的距离,所以一定要遍历到叶子节点时才能算是一个答案,具体代码看下面。

class Solution {
public:int result=INT_MAX;void dfs(TreeNode* root,int deepth){if(root->left==nullptr&&root->right==nullptr){result=result<deepth?result:deepth;}if(root->left){dfs(root->left,deepth+1);}if(root->right){dfs(root->right,deepth+1);}}int minDepth(TreeNode* root) {if(root==nullptr){return 0;}dfs(root,1);return result;}
};

上面的代码已经很清晰的写出了,求解最小深度的代码,当该节点的左右节点都为空时候,那么该节点才是叶子节点,这时候我们再收获答案,进行比较。第二种思路在这里就不给出了,和这种思路差不太多,但是本人认为使用高度来求深度应用在这道题中稍显麻烦了一些。

完全二叉树的节点个数

222. 完全二叉树的节点个数 - 力扣(LeetCode)

这道题也分成两种大致的思路,一种是按照正常思路解,即不管他是什么类型的二叉树,直接将所有节点全遍历一次,记录下一共遍历了几个节点,后返回答案,这样的思路无论是什么二叉树都能遍历出来,属于暴力解法。这里不给出代码。

第二种思路就是按照满二叉树的解法,满二叉树一定是完全二叉树,由于完全二叉树中一定会有某子树是完全二叉树,我们按照这样的性质来遍历,判断从根节点开始的各个子树是否满足满二叉树的特点来求解,这样的好处是可以减少遍历一部分的中间节点,但是值得注意的是,时间复杂度貌似和暴力求解差不多都是On。

class Solution {
public:int countNodes(TreeNode* root) {if(root==nullptr){return 0;}TreeNode* left=root->left;int leftval=0,rightval=0;TreeNode* right=root->right;while(left){left=left->left;leftval++;}while(right){right=right->right;rightval++;}if(leftval==rightval){return (2<<leftval)-1;}return countNodes(root->left)+countNodes(root->right)+1;}
}

代码绝大部分是结束判断语句,判断从某节点起始,它的子树是否为完全二叉树,因为如果是的话从该节点的两侧开始遍历如果节点数目相等,那么肯定就是完全二叉树,按照这样的思路,即可完成判断。判断成功了,返回的是当前完全二叉树共多少节点。这个代码不需要担心如果有单独节点出现,因为单独节点没有左右子树,也可以看作为完全二叉树!

总结:

今天我们完成了二叉树的最大深度、二叉树的最小深度、完全二叉树的节点个数三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

【Qt控件之QDialog】使用及技巧

简介 QDialog是Qt中的一个类&#xff0c;继承自QWidget类&#xff0c;用于创建对话框窗口&#xff0c;可以显示模态&#xff08;阻塞当前窗口&#xff09;或非模态的对话框。对话框可以包含各种控件&#xff0c;如按钮、文本框等&#xff0c;用于与用户进行交互。 主要函数说…

19哈希表——数组中的妙用

目录 LeetCode之路——202. 快乐数 分析&#xff1a; LeetCode之路——1. 两数之和 分析&#xff1a; 解法一&#xff1a;暴力枚举 解法二&#xff1a;哈希表 LeetCode之路——202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对…

CocosCreator 面试题(三)JavaScript闭包原理和作用

1、JavaScript闭包是什么&#xff1f; JavaScript闭包是指在函数内部创建的函数&#xff0c;它可以访问并持有创建它的父函数作用域中的变量&#xff0c;即使父函数已经执行完毕。闭包是JavaScript中强大而有用的概念&#xff0c;它可以用于创建私有变量、实现模块化和封装性&a…

312.戳气球

将戳气球转换到添加气球&#xff0c;记忆搜索slove(i,j)&#xff1a;在开区间(i,j)全部填满气球得到的最多硬币数&#xff0c;两端val[i]、val[j] class Solution { public:vector<vector<int>> ans;vector<int> val;int slove(int left,int right){if(left&…

COCI 2021-2022 #1 - Set 题解

思路 我们将原题中的数的每一位减一&#xff0c;此时问题等价。 下面的异或都是在三进制下的异或。&#xff08;相当于不进位的加法&#xff09; 我们考虑原题中的条件&#xff0c;对于每一位&#xff0c;如果相同&#xff0c;则异或值为 0 0 0&#xff0c;如果为 1 1 1&a…

【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)

自媒体文章上下架功能完成 需求分析 流程说明 接口定义 说明接口路径/api/v1/news/down_or_up请求方式POST参数DTO响应结果ResponseResult DTO Data public class WmNewsDto {private Integer id;/*** 是否上架 0 下架 1 上架*/private Short enable;}ResponseResult 自媒…

设计模式 - 行为型模式:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…

3.3.OpenCV技能树--二值图像处理--图像形态学操作

文章目录 1.图像形态学运算简介2.图像开运算处理2.1.图像开运算处理简介2.2.图像开运算处理代码2.3.图像开运算处理效果 3.图像闭运算处理3.1.图像闭运算处理简介3.2.图像闭运算处理代码3.3.图像闭运算处理效果 4.图像形态学梯度处理4.1.图像形态学梯度处理简介4.2.图像形态学梯…

考研人考研魂——英语单词篇(20231009)

下一站&#xff0c;上岸 consoleconsistentconsistconstituteconstitutionconstituentconstructdistinctdistinguishdistinctionconstantconstrainfruitfulfulfillfundfunctionfrustrateevidencefundamentalevilevidentenvironmententertainmententertainenterprisemonotonousm…

Gap Year Plan

Gap Year Plan gap year 几个大方向 健康 60 KG10 新朋友 钱 5W RMB基本常识、社会机制补齐开网店 英语 TOELF日常交流 & 面试 口语Science Research Writing 2nd 课程 科研常识CMU 15-445MIT 6.824CMU 15-721Full Stack OpenDDIA 实习 GSOC 2024 PostgreSQL / …

docker虚拟网桥和业务网段冲突处理

ifconfig查看docker虚拟网桥ip地址 docker inspect --format{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} $(docker ps -aq)查询所有容器的ip 修改docker-compose networks networks xxx-network: driver: bridge ipam: c…

redis,mongoDB,mysql,Elasticsearch区别

Redis&#xff1a; Redis是一种高性能键值存储数据库&#xff0c;基于内存操作&#xff0c;支持数据持久化&#xff0c;支持数据类型丰富灵活&#xff0c;如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、主从同步等功能&#xff0c;适用于访…

深入理解Docker:简化部署与管理的利器

文章目录 引言Docker简介Docker的背景和发展Docker的优势和特点 Docker的基本概念和架构镜像&#xff08;Image&#xff09;容器&#xff08;Container&#xff09;仓库&#xff08;Repository&#xff09;Docker架构 Docker的常用命令和操作Docker的安装和配置Docker镜像的管理…

Linux通过QQ邮箱账号使用mailx发送邮件

Linux通过QQ邮箱账号使用mailx发送邮件 第一步&#xff1a;安装mailx 第二步&#xff1a;获取邮箱的授权码 第三步&#xff1a;配置mailx服务 第四步&#xff1a;添加数字证书 第五步&#xff1a;发送邮件测试&#xff01; 第一步&#xff1a;安装mailx # 安装mailx yum…

Appium问题及解决:打开Appium可视化界面,点击搜索按钮,提示inspectormoved

打开Appium可视化界面&#xff0c;点击搜索按钮&#xff0c;提示inspectorMoved&#xff0c;那么如何解决这个问题呢&#xff1f; 搜索了之后发现&#xff0c;由于高版本Appium&#xff08;从1.22.0开始&#xff09;的服务和元素查看器分离&#xff0c;所以还需要下载Appium In…

六大核心原则,引领自动化正确实施

自动化在我们的日常工作中发挥着至关重要的作用&#xff0c;是涉及技术、合作伙伴和行业的自动化方案。尽管自动化如今已在各行业内迅速推广&#xff0c;但很大一部分企业仍在努力完善整个组织的自动化战略。 这里的困难在于&#xff0c;自动化通常是从组织内部的较低级别开始…

YOLOv5全新Neck改进:BiSPAN 结构独一无二,为目标检测打造全新融合网络,增强定位信号,对于小目标检测的定位具有重要意义

💡本篇内容:YOLOv5全新Neck改进:BiSPAN 结构升级版,为目标检测打造全新融合网络,增强定位信号,对于小目标检测的定位具有重要意义 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv…

unity操作_Camera c#

观察场景中Main Camera 的清除背景Clear Flags 第一种&#xff1a;Skybox天空盒渲染 制作3D游戏使用 第二种&#xff1a;Solid Color 制作2D游戏 第三种&#xff1a;Depth only 多个摄像机叠加渲染 相对重点学会多个摄像机设置Depth only使…

pycharm中个人编程时常用到的快捷键

pycharm中个人编程时常用到的快捷键&#xff1a; 仅个人经验总结&#xff0c;不为其他&#xff01; 1.CTRLShiftAlt鼠标选择多个位置 可以同时在多个位置进行编辑同样的内容 2. Ctrel Alt L快速将代码格式标准化 3. Ctrl F 在当前py文件中查找 4. Ctrl R快速替换当前…

Vue14 深度监视

深度监视 深度监视&#xff1a; (1).Vue中的watch默认不监测对象内部值的改变&#xff08;一层&#xff09;。 (2).配置deep:true可以监测对象内部值改变&#xff08;多层&#xff09;。备注&#xff1a; (1).Vue自身可以监测对象内部值的改变&#xff0c;但Vue提供的watch默认…