day14 | 100.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

news2024/11/16 11:45:55

文章目录

    • 一、二叉树的最大深度
    • 二、二叉树的最小深度
    • 三、完全二叉树的节点数

一、二叉树的最大深度

100.二叉树的最大深度
在这里插入图片描述
因为题给出的高度和深度是一样的,所以求得结果都能过。

class Solution
{
public:
    int getHeight(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        int leftHeight = getHeight(node->left);       // 左
        int rightHeight = getHeight(node->right);     // 右
        int hight = max(leftHeight, rightHeight) + 1; // 中
        return hight;
    }
    int maxDepth(TreeNode *root)
    {
        return getHeight(root);
    }
};

二、二叉树的最小深度

111.二叉树的最小深度
注意:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
最小高度也是复合我们求取的最小深度。

也是采用后序遍历,容易犯的错误:
在这里插入图片描述

错误的写法:
class Solution
{
public:
    int getHeight(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        int leftHeight = getHeight(node->left);
        int rightHeight = getHeight(node->right);
        int height = min(leftHeight, rightHeight) + 1;
        return height;
    }
    int minDepth(TreeNode *root)
    {
        return getHeight(root);
    }
};

确定递归函数的参数和返回值:

int getHeight(Treenode* node){}

确定终止条件:

int getHeight(Treenode* node){

}
class Solution
{
public:
    int getHeight(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        int leftHeight = getHeight(node->left);  // 左
        int rightHeight = getHeight(node->right);// 右
                                                      // 根
        if (node->left == nullptr && node->right != nullptr)
        {
            return 1 + rightHeight; // +1 是为了算上当前节点
        }
        if (node->left != nullptr && node->right == nullptr)
        {
            return 1 + leftHeight; // +1 是为了算上当前节点
        }

        return 1 + min(leftHeight, rightHeight); // +1 是为了算上当前节点
    }

    int minDepth(TreeNode *root)
    {
        return getHeight(root);
    }
};

三、完全二叉树的节点数

222.完全二叉树的节点个数

1️⃣普通二叉树的写法:
利用后序遍历来写

class Solution
{
public:
    int getNum(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        int leftnum = getNum(node->left);
        int rightnum = getNum(node->right);
        int num = leftnum + rightnum + 1;
        return num;
    }
    int countNodes(TreeNode *root)
    {
        return getNum(root);
    }
};

2️⃣利用完全二叉树的特性:
代码随想录 完全二叉树节点数的计算

满二叉树节点的计算公式:n = 2h -1
如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

如何去判断一个左子树或者右子树是不是满二叉树呢?
在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

递归函数的参数和返回值:

int countNodes(TreeNode* node){}

两种终止条件:
第一种:

遇到节点为空的情况
if (root == nullptr) return 0;

第二种:

遇到满二叉树的情况
TreeNode *left = node->left;
TreeNode *right = node->right;
int leftDepth = 0;
int rightDepth = 0;

while (left)
{
    left = left->left;
    leftDepth++;
}
while (right)
{
    right = right->right;
    rightDepth++;
}
if (rightDepth == leftDepth)
{
    return (2 << leftDepth) - 1;
}

单层递归逻辑:

return countNodes(node->left) + countNodes(node->right) + 1;

完整代码:

class Solution
{
public:
    int countNodes(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        TreeNode *left = node->left;
        TreeNode *right = node->right;
        int leftDepth = 0;
        int rightDepth = 0;

        while (left)
        {
            left = left->left;
            leftDepth++;
        }
        while (right)
        {
            right = right->right;
            rightDepth++;
        }
        if (rightDepth == leftDepth)
        {
            return (2 << leftDepth) - 1;
        }
        int leftnum=countNodes(node->left); // 左
        int rightnum=countNodes(node->right); // 右
        int num = leftnum + rightnum + 1; // 根
        return num;
    }
};

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

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

相关文章

Qt 第三讲 手动拖动ui界面组件,事件处理机制,实现简单闹钟

手动拖动ui界面组件&#xff0c;实现闹钟 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->btn_end->setEnabled(false);speecher new QTex…

Linux基础内容(29)—— 额外锁

Linux基础内容&#xff08;28&#xff09;—— POSIX信号量与循环队列_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131844590?spm1001.2014.3001.5501 目录 1.其他常见的各种锁 自旋锁 库语言的实现 2.读者写者问题 1.读者写者线程 2.…

SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...

写了一个基本的SpringMVC程序进行测试&#xff0c;结果启动时一直显示在等待部署完毕&#xff0c;&#xff0c;&#xff0c; but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿&#xff0c;也不知道哪儿错了&#xff0c;&…

什么是多运行时架构?

服务化演进中的问题 自从数年前微服务的概念被提出&#xff0c;到现在基本成了技术架构的标配。微服务的场景下衍生出了对分布式能力的大量需求&#xff1a;各服务之间需要相互协作和通信&#xff0c;以及共享状态等等&#xff0c;因此就有了各种中间件来为业务服务提供这种分…

紫光FPGA试用--软件篇

目录 一 软件安装启动 二 如何打开IP核&#xff1f;查看/修改现有IP核参数&#xff1f; 三 如何定义引脚&#xff1f; 四 如何下载code进入FPGA? 1. 下载到FPGA芯片内&#xff1a; 2.下载到外部FLASH中 五 如何进入在线调试模式&#xff0c;调试步骤 操作步骤&#xff…

微分流形之魂

找到一个非常棒的教程&#xff1a;本科生自学微分流形有哪些资料推荐&#xff1f; - 知乎 应该是目前微积分的终极答案了&#xff08;非数学系&#xff09; 首先&#xff0c;这个函数具有线性结构。所以他是属于V*的。 之前我倒没想过这个问题&#xff0c;以为所有的泛函都是V…

4个公式8个案例学会与AI GPT对话

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. chatgpt体验&#xff1a;http://www.chat136.com chatgpt学习&#xff1a…

【OJ比赛日历】快周末了,不来一场比赛吗? #07.29-08.04 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-07-29&#xff08;周六&#xff09; #8场比赛2023-07-30…

一文带你迅速入门SprIngMVC,看这一篇就足够了!

0. 什么是SpringMVC 要知道什么是SpringMVC&#xff0c;我们首先得知道什么 MVC&#xff0c;MVC是软件工程中的一种架构模式&#xff0c;分为 Model、View、Control。它把软件系统分为模型、视图和控制器三个基本部分。 Model&#xff1a;模型&#xff0c;应用程序负责数据逻…

SVN - 记录一下无法提交代码 提示:被锁定(locked)

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;导致代码无法提交&#xff08;commit&#xff09;和更新&#xff08;update&#xff09; 主要报错如下&#xff1a; 解决方法&#xff1a; 然后点击 Clean up 选中一下选项&#xff…

人工智能巨头碰撞——埃隆·马斯克推出xAI挑战OpenAI的统治地位

目录 前言XAI 的推出什么是XAI&#xff1f;它将聚焦于什么&#xff1f; 一&#xff1a;“反AI斗士”马斯克进军AI&#xff0c;你怎么看&#xff1f;二&#xff1a;回顾上半年的“百模大战”&#xff0c;中国的AI产业怎么样了&#xff1f;三&#xff1a;AI大模型这把火&#xff…

算法通过村第二关-链表白银笔记

文章目录 再战链表|反转链表剑指 Offer II 024. 反转链表熟练掌握这两种解法建立头节点的解决思路不采用建立头节点的方法采用循环/递归的方式解决 总结 再战链表|反转链表 提示&#xff1a;多拿些酒来&#xff0c;因为生命只有乌有。 剑指 Offer II 024. 反转链表 如果不使用…

9个可用于图片转文本的最佳免费 OCR 软件

光学字符识别 (OCR) 软件可帮助将不可编辑的文档格式&#xff08;例如 PDF、图像或纸质文档&#xff09;转换为可编辑和可搜索的机器可读格式。 OCR 应用程序通常用于从 PDF 和图像中捕获文本&#xff0c;并将文本转换为可编辑格式&#xff0c;例如 Word、Excel 或纯文本文件。…

SpringBoot复习:(3)应用打包成jar包,清单文件里的主类是我们用@SpringBootApplication注解标记的类吗?

不是. MANIFEST.MF类似如下&#xff1a; Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx Start-Class: com.example.demo.DemoApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-…

DevOps-GitHub/GitLab

DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库&#xff0c;提供共有仓库和私有仓库&#xff08;私有仓库收费&#xff09;。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作&#xff0c;这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…

不用手动编程!ChatGPT帮你轻松实现单片机按键输入功能

从今年年初&#xff0c;OpenAI发布的ChatGPT已摧古拉朽之势席卷全球&#xff0c;短短两个月注册用户数就超过1亿人&#xff0c;是全世界增长速度最快的应用。很多人都说今年是AI元年&#xff0c;其实也是有一定道理的&#xff0c;之前的AI门槛相对较高&#xff0c;很多人没有机…

python使用CGI编程,网页写个标题

需要有个 Linux虚拟机&#xff0c;安装 apache&#xff0c; 本次使用 deepin v23&#xff0c;参考&#xff1a; sudo apt install apache2 #安装 apache2 systemctl start apache2 # 启动 apache2 sudo a2enmod cgi # 启用CGI模块 sudo mkdir /usr/lib/cgi-bin #创…

APT32组织针对我国关基单位攻击活动分析

事件背景 2022年5月&#xff0c;绿盟科技伏影实验室与运营能力中心梅花K战队共同于国家某关基单位发现异常外联IP&#xff0c;通过攻击活动中捕获的攻击流量分析&#xff0c;确认此次攻击活动是由境外APT组织APT32所发起。 绿盟科技伏影实验室与运营能力中心梅花K战队利用主机…

2 种方式查找极狐GitLab 容器镜像 Tag,几分钟快速构建私有化部署实例

目录 通过 Helm 命令查找 第1步&#xff1a;添加 Helm Chart 第2步&#xff1a;更新 Helm Chart 第3步&#xff1a;Helm search 查找过往 tag 通过 Omnibus package 来查 极狐GitLab 是一个一体化 DevOps 平台&#xff0c;其灵活的私有化部署方式&#xff08;源代码安装、…

通识测试09缺陷和缺陷报告

缺陷和缺陷报告 缺陷的基本概述 缺陷的定义 缺陷的属性 正向的测试用例缺陷远高于反向的。 缺陷的类型 缺陷的生命周期 缺陷的识别 缺陷报告 缺陷报告 缺陷报告编写目的 需求、用例、bug的关系