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

news2024/11/17 9:33:46

在这里插入图片描述

​📝个人主页:@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.coloradmin.cn/o/1065580.html

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

相关文章

插入排序/折半插入排序

插入排序/折半插入排序 插入排序 插入排序(英语&#xff1a;Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…

IDEA中字符串怎么自动转义,双引号自动转义的小技巧

1.选中要填写的字符串 &#xff0c;按altenter 2.点击 Inject language or reference&#xff0c;选择JSON组件 3.再次按altenter&#xff0c;点击Edit JSON Fragment 4.在弹出的窗口编辑源字符串&#xff0c;代码中字符串就能自动转义了

ThreeJS-3D教学五-材质

我们在ThreeJS-3D教学二&#xff1a;基础形状展示中有简单介绍过一些常用的材质&#xff0c;这次我们举例来具体看下效果&#xff1a; 代码是这样的&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

4.绘制颜色点(点击)

愿你出走半生,归来仍是少年&#xff01; 在点击绘制点的基础上&#xff0c;通过片源着色器给每个点设置颜色。以原点为中心&#xff0c;在一象限的点为红色&#xff0c;三象限为绿色&#xff0c;其他象限为白色。 1.知识点 1.1.Uniform变量 向片源着色器传入的数据变量。 1.…

1700*D. Flowers(DP前缀和预处理打表)

Problem - 474D - Codeforces 题意&#xff1a; 有白花和红花两种&#xff0c;把 x 朵花排成一排&#xff0c;要求白花必须连续 k 个一块放置&#xff0c;则有 cnt 种情况。给出 a 和 b&#xff0c;计算a到b之间的 x 对应的 cnt 总和&#xff0c;并且对1e97取模。 解析&#x…

第二证券:A股反弹已至?9月最牛金股涨超41%

进入10月&#xff0c;作为券商月度战略精华的新一期金股也连续宣布。 从各券商关于十月份的大势研判来看&#xff0c;一些券商达观地认为反弹行情正在打开&#xff0c;也有一些券商认为仍是轰动市。具体配备上&#xff0c;AI、科创相关的标的仍然遭到喜欢&#xff0c;一起不少…

OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击

作者&#xff1a;gentle_zhou 原文链接&#xff1a;OWASP Top 10漏洞解析&#xff08;3&#xff09;- A3:Injection 注入攻击-云社区-华为云 Web应用程序安全一直是一个重要的话题&#xff0c;它不但关系到网络用户的隐私&#xff0c;财产&#xff0c;而且关系着用户对程序的新…

SAP BC TSV_TNEW_PAGE_ALLOC_FAILED

解决方案&#xff1a; 1)业务上&#xff0c;限制数据量&#xff0c;分多次查数据 2)调整参数 临时调整 se38 -rsmemory

PLC之间无线通信-不用编程实现多品牌PLC无线通讯的解决方案

本文是PLC设备之间基于IGT-DSER系列智能网关实现WIFI无线通讯的案例。采用西门子S7-1500系列的PLC作为主站&#xff0c;与其它品牌的PLC之间进行网络通讯。案例包括智能网关AP方式、现场WIFI信号两种方式。有线以太网方式实现PLC之间通讯的案例 一、智能网关AP方式 将网络中的其…

Vercel部署个人静态之DNS污染劫持问题

vercel是我第一次接触静态网站托管所使用的服务&#xff0c;类似的还有github以及Netfily。但是Vercel的自动化构建远比github page方便的多。通过github授权给Vercel就实现了自动拉取构建及发布的一系列流程。在本地推送代码可以使用小乌龟工具&#xff0c;线上代码发布使用Ve…

【msg_msg+sk_buff】D3CTF2022-d3kheap

前言 本方法来自 CVE-2021-22555&#xff0c;非常漂亮的组合拳&#xff0c;仅仅一个 1024 的 UAF 即可提权&#xff0c;但是对于小堆块的 UAF 不适用。 程序分析 启动脚本如下&#xff1a; #!/bin/sh qemu-system-x86_64 \-m 256M \-cpu kvm64,smep,smap \-smp cores2,thr…

python性能分析

基于cProfile统计函数级的时延&#xff0c;生成排序列表、火焰图&#xff0c;可以快速定位python代码的耗时瓶颈。参考如下博文结合实操&#xff0c;总结为三步&#xff1a; 使用 cProfile 和火焰图调优 Python 程序性能 - 知乎本来想坐下来写篇 2018 年的总结&#xff0c;仔细…

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(二)

前言 目标识别如今以及迭代了这么多年&#xff0c;普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性…

全平台高速下载器Gopeed

什么是 Gopeed ? Gopeed &#xff08;全称 Go Speed&#xff09;是一款支持全平台的高速下载器&#xff0c;开源、轻量、原生&#xff0c;采用 Golang Flutter 开发&#xff0c;支持&#xff08;HTTP、BitTorrent、Magnet 等&#xff09;协议&#xff0c;并支持所有平台。 已…

linearlayout中使用多个weight导致部分子控件消失异常

问题描述&#xff1a; 在一个linearlayout中写了两个用到weight的布局&#xff0c;在androidstudio中显示正常 但是代码跑起来之后最下面哪一行都消失了&#xff1b; 解决办法1 把两个用到weight的改成一个了&#xff0c;外面那层的weight写成固定宽度就能正常显示出丢失的…

【C++】vector的模拟实现 | 使用memcpy拷贝时的问题 | 实现深拷贝

目录 基本框架及接口 构造函数 无参构造 迭代器区间构造 初始化构造 析构函数 size() | capacity() 扩容的reserve() 使用memcpy拷贝的问题 改变大小的resize() operator[] 迭代器的实现 vector的增删 尾插push_back() 尾删pop_back() 在指定位置插入insert() …

【prism】prism 框架代码

前言 这个是针对整个专栏的一个示例程序,应用了专栏里讲的一些知识点,他是一个小而美的Prism的框架代码,一个模板,方便大家去扩展一个prism工程。 下面是一些代码片段,最后我给出整个工程的下载链接~~~ 代码片段 主界面代码 <Window x:Class="PrismTest.View…

企业加密软件哪个最好用?

天锐绿盾是一款专业的企业级加密软件&#xff0c;提供专业版、行业增强版和旗舰版&#xff0c;分别针对不同的用户需求。 PC访问地址&#xff1a; 首页 天锐绿盾专业版主要面向企事业单位的通用需求&#xff0c;以"让防泄密的管理更简单有效"为核心理念&#xff0c;…

ipv6跟ipv4如何通讯

IPv6的128位地址通常写成8组&#xff0c;每组为四个十六进制数的形式。比如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个合法的IPv6地址。这个地址比较长&#xff0c;看起来不方便也不易于书写。零压缩法可以用来缩减其长度。如果几个连续段位的值都是0&#xff0c;那么这…

从本地到全球:跨境电商的壮丽崛起

跨境电商&#xff0c;作为数字时代的商业现象&#xff0c;正在以惊人的速度改变着全球贸易的面貌。它不仅仅是一种商业模式&#xff0c;更是一场无国界的革命&#xff0c;使商业不再受限于地理位置&#xff0c;而是全面融入全球市场。 本文将深入探讨跨境电商的崛起&#xff0…