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

文章目录

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

一、二叉树的最大深度

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.mfbz.cn/a/47332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytest学习教程_基础知识(一)

前言 pytest是一个用于编写和执行Python单元测试的框架。它提供了丰富的功能和灵活性&#xff0c;使得编写和运行测试变得简单而高效。 pytest的一些主要特点和解释如下&#xff1a; 自动发现测试&#xff1a;pytest会自动查找以"test_"开头的文件、类和函数&#x…

腾讯 SpringBoot 高阶笔记,限时开源 48 小时,真香警告

众所周知&#xff0c;SpringBoot 最大的一个优势就是可以进行自动化配置&#xff0c;简化配置&#xff0c;不需要编写太多的 xml 配置文件&#xff1b;基于 Spring 构建&#xff0c;使开发者快速入门&#xff0c;门槛很低&#xff1b;SpringBoot 可以创建独立运行的应用而不需要…

【学习笔记】目标跟踪领域SOTA方法比较

目录 前言方法1 TraDeS:2 FairMOT:3 SMILEtrack:4 ByteTrack: 前言 常用于行人跟踪的多目标跟踪数据集包括&#xff1a;MOT 15/16/17/20、PersonPath22等… 为更好比较现有SOTA算法的检测性能&#xff0c;本博客将针对在各数据集上表现较优的算法模型进行介绍。&#xff08;表…

ip校园广播音柱特点

ip校园广播音柱特点IP校园广播音柱是一种基于IP网络技术的音频播放设备&#xff0c;广泛应用于校园、商业区、公共场所等地方。它可以通过网络将音频信号传输到不同的音柱设备&#xff0c;实现远程控制和集中管理。IP校园广播音柱具备以下特点和功能&#xff1a;1. 网络传输&am…

SSM框架 基础

1.数据库 2.工程 3.pom 4.web.xml 5.spring配置文件头部 6.实体类 7.StudentMapper接口 8. StudentMapper.xml 9.StudentService 10. StudentServiceImpl 11.StudentController 实战 查询所有 StudentMapper StudentService StudentServiceImpl StudentMapper.xml Stude…

效率与质量兼备的6个设计工具!

今天本文为大家推荐的这6个设计工具&#xff0c;将帮助设计师实现高效工作&#xff0c;同时也更好地展示自己的创作力&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款国内的设计工具&#xff0c;它为设计师提供了非常多实用的设计功能和精致的设计素材&…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

day41-Verify Account Ui(短信验证码小格子输入效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day41-Verify Account Ui&#xff08;短信验证码小格子输入效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…

【西安交通大学】:融合传统与创新的学府之旅

【西安交通大学】&#xff1a;融合传统与创新的学府之旅 引言历史与发展学校特色学科优势院系专业校园环境与设施学生生活与社团活动校友荣誉与成就未来发展展望总结&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&…

Linux基础以及常用命令

目录 1 Linux简介1.1 不同应用领域的主流操作系统1.2 Linux系统版本1.3 Linux安装1.3.1 安装VMWare1.3.2 安装CentOS镜像1.3.3 网卡设置1.3.4 安装SSH连接工具1.3.5 Linux和Windows目录结构对比 2 Linux常用命令2.0 常用命令&#xff08;ls&#xff0c;pwd&#xff0c;cd&#…

你说你会Java手动锁,但你会这道题吗???

按照这个格式输出你会吗&#xff1f;&#xff1f;&#xff1f; 你说你不会&#xff0c;接下来认真看认真学了。 1.首先引入原子类。AtomicInteger num new AtomicInteger(0); 什么是原子类&#xff1f; 就是可以保证线程安全的原子操作的数据类型。 有什么作用&#xff1f;…

2.2 模型与材质基础

一、渲染管线与模型基础 1. 渲染管线 可编程阶段&#xff08;蓝色区域&#xff09;&#xff1a; 1顶点着色器 2几何着色器 3片元着色器 2. 模型的实现原理 UV&#xff1a;在建模软件中&#xff0c;进行UV展开&#xff0c;UV会放在一个横向为U纵向为V&#xff0c;范围&#xff0…

【Linux】深入理解缓冲区

目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里 手动设计一个用户层缓冲区 什么是缓冲区 缓冲区本质上一块内存区域&#xff0c;用来保存临时数据。缓冲区在各种计算任务中都广泛应用&#xff0c;包括输入/输出操作、网络通信、图像处理、音频处理等。 …

【前端笔记】本地运行cli项目报错ERR_OSSL_EVP_UNSUPPORTED

报错原因 Node版本>17.x&#xff0c;本地npm run 起项目后会发现终端报错&#xff0c;具体有以下2块关键信息&#xff1a; Error: error:0308010C:digital envelope routines::unsupported和 opensslErrorStack: [ error:03000086:digital envelope routines::initializa…

Python补充笔记5-模块化、文件

目录 一、模块 二、模块的导入 三、python中的包​编辑 四、常用的内容模块 五、第三方模块的安装与使用 六、编码格式的介绍 七、文件读写的原理 八、常用的文件打开模式 ​九、文件对象的常用方法 十、with语句​编辑 十一、os模块的常用函数 十二、os.path模块的常用方法​编…

TCP协议如何实现可靠传输

TCP最主要的特点 TCP是面向连接的运输层协议&#xff0c;在无连接的、不可靠的IP网络服务基础之上提供可靠交付的服务。为此&#xff0c;在IP的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP最主要的特点&#xff1a; TCP是面向连接的输出层协议 每一条…

如何启用路由器dhcp?快解析如何内网穿透?

一、什么是DHCP&#xff1f; 动态主机设置协议&#xff08;DHCP&#xff09;是一种使网络管理员能够集中管理和自动分配 IP 网络地址的通信协议。在网络中&#xff0c;每个联网设备都需要分配独有的 IP 地址。并当有新计算机移到网络中的其它位置时&#xff0c;能自动收到新的…

微服务——http客户端Feign

目录 Restemplate方式调用存在的问题 Feign的介绍 基于Feign远程调用 Feign自定义配置 修改日志方式一(基于配置文件) 修改日志方式二(基于java代码) Feign的性能优化 连接池使用方法 Feign_最佳实践分析 方式一: 方式二 实现Feign最佳实践(方式二) 两种解决方案 Re…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

【梯度下降在波士顿房价预测中的应用】

数据准备 我们首先需要加载波士顿房价数据集。该数据集包含房屋特征信息和对应的房价标签。 import pandas as pd import numpy as npdata_url "http://lib.stat.cmu.edu/datasets/boston" raw_df pd.read_csv(data_url, sep"\s", skiprows22, headerN…