【力扣刷题 | 第十二天】

news2024/9/23 5:15:52

目录

前言:

104. 二叉树的最大深度 - 力扣(LeetCode)

111. 二叉树的最小深度 - 力扣(LeetCode)

前序遍历: 

  后序遍历:

总结:


前言:

          今天还是对树的基础题进行刷题,感兴趣的同学可以看一看。

104. 二叉树的最大深度 - 力扣(LeetCode)

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

  注意点深度不是高度,我们用图片给大家演示:

深度:指该节点到根节点的距离。

高度:指节点到叶子节点的距离。

 其实我们简单的推一下就可以知道用什么查找方式来对二叉树的深度和高度进行查找

求节点深度:

在二叉树中,求深度通常需要遍历树上的每一个节点,并记录每一个节点的深度。根据深度优先遍历 (DFS) 的思想,我们可以使用后序遍历来求深度。

后序遍历的遍历顺序是:先遍历左子树,再遍历右子树,最后遍历根节点。因此,当我们遍历到某个节点时,它的左子树和右子树都已经被处理过了,我们可以根据它的左子树和右子树的深度来求出该节点的深度。然后再将该节点的深度加 1,就可以得到它的父节点的深度。

使用后序遍历求深度的好处在于,我们可以在遍历过程中利用子问题的结果,从底层向上层逐步推导,避免了反复遍历子树的过程,从而提高了遍历效率。此外,该算法的空间复杂度为 O(1),相比于其他遍历方式,它不需要使用额外的存储空间,较为节省空间。

求节点高度:

在二叉树中,求深度时可以使用前序遍历的方式进行递归求解。前序遍历的遍历顺序是:先遍历根节点,然后遍历左子树,最后遍历右子树。因此,当我们遍历到某个节点时,该节点的深度已经确定,可以根据该节点的深度,推算出其子节点的深度并记录下来。接着,我们可以递归遍历该节点的左子树和右子树,分别计算左右子树的深度,并将两者中较大的深度作为该节点的深度。这样,我们依次遍历每个节点,就可以得到该树的深度。

使用前序遍历求深度的好处在于,我们可以在遍历过程中,自下而上地递推推算深度。在处理子问题时,如果子问题的深度已知,就可以利用已知的深度求解当前节点的深度。这样可以避免重复遍历子树,从而提高求解效率。

 求二叉树的最大深度,实际上就是在求这个二叉树的根节点的高度。

class Solution {
public:
    int getdepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftdepth = getdepth(node->left);       // 左
        int rightdepth = getdepth(node->right);     // 右
        int depth = 1 + max(leftdepth, rightdepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    }
};

111. 二叉树的最小深度 - 力扣(LeetCode)

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

其实这道题虽然部分思路是和求最大深度一样的,但是还是有很多的细节不一致,因此我们不可以直接套用二叉树 最大深度进行计算。很多人就是对这里的最小深度理解错误才导致解题出错

叶子节点:
在二叉树中,叶子节点指的是没有子节点的节点,也称为终端节点。二叉树中只有叶子节点才是最底层的节点,其余的节点都有至少一个子节点。

前序遍历: 

具体做法如下:

  1. 如果根节点为空,则返回 0。

  2. 如果根节点的左子树为空,则递归计算右子树的最小深度,并将其加 1,即为整棵树的最小深度。

  3. 如果根节点的右子树为空,则递归计算左子树的最小深度,并将其加 1,即为整棵树的最小深度。

  4. 如果根节点的左右子树均非空,则递归计算左子树和右子树的最小深度,将两者中较小的深度加 1,即为整棵树的最小深度。

 

class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);           // 左
        int rightDepth = getDepth(node->right);         // 右
                                                        // 中
        // 当一个左子树为空,右不为空,这时并不是最低点
        if (node->left == NULL && node->right != NULL) { 
            return 1 + rightDepth;
        }   
        // 当一个右子树为空,左不为空,这时并不是最低点
        if (node->left != NULL && node->right == NULL) { 
            return 1 + leftDepth;
        }
        int result = 1 + min(leftDepth, rightDepth);
        return result;
    }

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

  后序遍历:

具体做法如下:

  1. 如果根节点为空,则返回 0。

  2. 如果根节点的左子树和右子树均为空,返回 1。

  3. 如果根节点的左子树或右子树为空,则递归计算另一棵子树的最小深度,并将其加 1,即为整棵树的最小深度。

  4. 如果根节点的左右子树均非空,则递归计算左子树和右子树的最小深度,将两者中较小的深度加 1,即为整棵树的最小深度。

def min_depth(root):
    if root is None:
        return 0
    if root.left is None and root.right is None:
        return 1
    if root.left is None:
        return min_depth(root.right) + 1
    if root.right is None:
        return min_depth(root.left) + 1
    return min(min_depth(root.left), min_depth(root.right)) + 1

总结:

        二叉树章节是递归的重灾区,各位要想学好二叉树,就要学好递归。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

 

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

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

相关文章

大数据Doris(四十七):开启Steam Load记录

文章目录 开启Steam Load记录 一、停止 Doris 集群 二、在 node3-node5 BE 节点上配置 be.conf 三、重新启动 Doris 集群 开启Steam Load记录 后续执行Stream Load 导入任务后,我们会在Doris集群中会查询对应Stream Load任务的情况,默认BE是不记录S…

【Rust日报】2023-06-20 使用Quickwit、Jaeger和Grafana监控您的Rust应用程序

使用Quickwit、Jaeger和Grafana监控您的Rust应用程序 你可能已经看过了Lucas Palmieri的博客文章Are we observable yet? An introduction to Rust telemetry。如果你还没有看过,我们建议阅读一下,因为它提供了一个全面的介绍,介绍了如何处理…

【Python 基础篇】Python 函数:代码重用的利器

文章目录 导言一、创建函数二、函数参数1、位置参数2、关键字参数3、默认参数 三、函数返回值四、函数的高级用法1、递归函数2、匿名函数3、内置函数 总结 导言 函数是一种在Python中定义和封装可重用代码的重要机制。它们使我们能够将复杂的任务分解为更小的部分,…

【算法与数据结构】15、LeetCode三数之和

文章目录 一、题目二、双指针法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、双指针法 思路分析:我们使用双指针法,但这道题因为要求数组三个元素的和,一共用到了三个指…

新人拿到一个web项目如何使用idea发布运行

本文描述的是一个新手,拿到一个web项目,使用idea如何发布运行。项目中没有非常复杂的元素,只是试着描述应该如何配置相关内容。 内容描述前提,首先请您确认tomcat已经安装,其次确认jdk已经安装,并明确他们在…

基于Java农产品仓库管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

管理类联考——逻辑——技巧篇——论证推理(10-12 道左右)——五大秒杀思路

逻辑考试出题思路分类 论证推理(10-12 道左右) 论证推理细分思路 假设——补全逻辑假设——引入前提前真后假 - 前假后真建立联系型支持由果推因的削弱由因推果 / 直接引入他因指出不同 / 指出相同五大固定秒杀思路解释类题目评价类题目 论证推理题目…

C语言学习(二十四)---递归与冒泡排序法

在前面几节的内容中,我们学习了指针的相关概念,至此,指针的内容就暂时告一段落了,今天我们将继续向下学习,主要内容为递归和冒泡排序法,好了,话不多说,开整!!…

【AndroidUI设计】主界面设计-Toolbar的简单使用

文章目录 一、引言二、了解三、编码1、UI设计2、编码 一、引言 描述:需要设计一个主界面,菜单通过主界面的左边界划入,实现点击跳转修改主界面内容的一个效果,并且点击非内容区域恢复原界面的一个效果。做到菜单的弹出&#xff0…

Vue3 One Piece Study

目录 脚手架安装vue3 使用vue-cli创建 使用vite创建 setup 介绍 示例使用 ref函数 介绍 代码示例 reactive函数 介绍 代码示例 脚手架安装vue3 使用vue-cli创建 vue create 项目名 安装完成 进入到刚才创建的项目目录中 cd vue3_test 输入npm run serve测试 使用…

基于Java健康综合咨询问诊平台设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

STM32 HAL库开发——入门篇(2):定时器

目录 一、TIMER定时器概述 1.1 软件定时原理 1.2 定时器定时原理 1.3 STM32定时器分类 1.4 STM32定时器特性表 1.5 STM32基本、通用、高级定时器功能整体的区别 二、基本定时器 2.1 基本定时器简介 2.3 STM32定时器计数模式及溢出条件 2.4 定时器中断实验相关寄存器 …

MySQL创建商品订单数据库

目录 一、商品分类表 ProductClass1. 创建 ProductClass表2. 插入数据3. 展示 二、客户表 Customer记录1. 创建 Customer表2. 插入数据3. 展示 三、商品表 Product1. 创建 Product表2. 插入数据3. 展示 四、员工表Employee1. 创建 Employee表2. 插入数据3. 展示 五、订单主表 O…

kubernetes_核心组件_KubeProxy_KubeProxy三种模式和参数解析

系列文章目录 文章目录 系列文章目录前言一、kube-proxy三种服务负载模式1.1 userspace 模式1.2 iptables 模式1.3 ipvs 模式 二、kube-proxy 启动参数基本参数目录挂盘kubeproxy配置项(ConfigMap)kube-proxy 启动参数 三、kube-proxy 常用命令四、宿主机上的iptables规则&…

数据结构链表(C语言实现)

绪论 机遇对于有准备的头脑有特别的亲和力。本章将讲写到链表其中主要将写到单链表和带头双向循环链表的如何实现。 话不多说安全带系好,发车啦(建议电脑观看)。 附:红色,部分为重点部分;蓝颜色为需要记忆的…

【微服务】一文了解Nginx网关搭建教程

一文了解Nginx网关搭建教程 Nginx网关搭建nginx配置Nginx网关搭建 那么什么是Nginx呢? nginx是一个高性能HTTP服务器,反向代理服务器,邮件代理服务器,TCP/UDP反向代理服务器。 单个系统主要用于处理客户端请求,一个系统处理客户端的请求量是有限的,当客户端的并发量超…

CROSSROADS: 1实战演练

文章目录 CROSSROADS: 1实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、dirsearch扫描目录4、查看隐写5、枚举用户6、暴力破解7、访问共享文件夹8、查看第一个flag9、写入shell并连接 二、后渗透1、查看权限和SUID文件2、运行程序3、切换root3、查看第…

2019 - 2023,再见了我的大学四年

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js 等) 📃个人状态: 2023届本科毕业生,已拿多个前端 offer&#x…

【Linux环境基础开发工具】编译器-gcc/g++

写在前面: 上一篇博客, 我们学习了vim编辑工具,学会了怎么写代码, 这篇文章,我将分享代码该怎么编译的问题。 目录 写在前面: 1. gcc和g介绍 2. gcc是如何编译程序的 1. 预处理 2. 编译 3. 汇编 …

CPM-Bee大模型微调

CPM-Bee大模型微调 CPM-Bee简介:环境配置:应用场景:模型训练参数训练命令:推理:评估:结论: CPM-Bee 简介: CPM-Bee是一个完全开源、允许商用的百亿参数中英文基座模型,也…