代码随想录刷题题Day13

刷题的第十三天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day13 任务
● 104.二叉树的最大深度 559.n叉树的最大深度
● 111.二叉树的最小深度
● 222.完全二叉树的节点个数

1 二叉树的最大深度 && n叉树的最大深度

根据上一篇实现层序遍历的模板,用迭代法解决了这两道题
在这里插入图片描述
递归法:

本题可以使用前序(中左右),也可以使用后序遍历(左右中),前序遍历求的是深度,后序遍历求得是高度

(1)确定递归函数得参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型

int getheight(TreeNode* node)

(2)确定终止条件:如果为空节点的话,就返回0,表示高度为0

if (node == NULL) return 0;

(3)确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度

int leftheight = getheight(node->left);
int rightheight = getheight(node->right);
int height = 1 + max(leftheight, rightheight);
return height;

C++:

class Solution {
public:int maxDepth(TreeNode* root) {if (root == NULL) return 0;int leftheight = maxDepth(root->left); // 左int rightheight = maxDepth(root->right); // 右int height = 1 + max(leftheight, rightheight); // 中return height;}
};

精简之后的代码:

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

迭代法
C++:

class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*> que;int depth = 0;if (root == NULL) return 0;que.push(root);while (!que.empty()){int size = que.size();depth++;while (size--){TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return depth;}
};

在这里插入图片描述
和二叉树求最大深度思路是一样的

递归法:

class Solution {
public:int maxDepth(Node* root) {int depth = 0;if (root == NULL) return 0;for (int i = 0; i < root->children.size(); i++){depth = max(depth, maxDepth(root->children[i]));}return depth + 1;}
};

迭代法
C++:

class Solution {
public:int maxDepth(Node* root) {queue<Node*> que;int depth = 0;if (root == NULL) return 0;que.push(root);while (!que.empty()){int size = que.size();depth++;// 记录深度while (size--){Node* node = que.front();que.pop();for (int i = 0; i < node->children.size(); i++){que.push(node->children[i]);}}}return depth;}
};

2 二叉树的最小深度

在这里插入图片描述
在这里插入图片描述
最小深度是从根节点到最近叶子节点的最短路径上的节点数量,注意是叶子节点(左右孩子都为空的节点才是叶子节点)
递归法:
(1)确定递归函数的参数和返回值

int getDepth(TreeNode* node)

(2)确定终止条件
终止条件也是遇到空节点返回0,表示当前节点的高度为0

if (node == NULL) return 0;

(3)确定单层递归的逻辑

  1. 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
  2. 右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。
  3. 最后如果左右子树都不为空,返回左右子树深度最小值 + 1
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;

求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑
递归法
C++:

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

迭代法
C++:

class Solution {
public:int minDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while (!que.empty()){int size = que.size();depth++; // 记录最小深度for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);if (!node->left && !node->right){return depth;}}}return depth;}
};

3 完全二叉树的节点个数

在这里插入图片描述
思路:

普通二叉树的求法以及利用完全二叉树的求法

普通二叉树
递归法
遍历顺序:左右中
(1)确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型

int getNodeNum(TreeNode* cur)

(2)确定终止条件:如果为空节点的话,就返回0,表示节点数为0。

if (cur == NULL) return 0;

(3)确定单层递归的逻辑:

先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

int leftNum = getNodeNum(cur->left);
int rightNum = getNodeNum(cur->right);
int treeNum = leftNum + rightNum + 1;
return treeNum;

C++:

class Solution {
public:int countNodes(TreeNode* root) {if (root == NULL) return 0;int leftNum = countNodes(root->left);// 左int rightNum = countNodes(root->right);// 右int result = leftNum + rightNum + 1;// 中return result;}
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( l o g n ) O(log n) O(logn),算上了递归系统栈占用的空间
迭代法

class Solution {
public:int countNodes(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);int result = 0;while (!que.empty()){int size = que.size();for (int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();result++;// 记录节点数量if (node->left) que.push(node->left);if (node->right) que.push(node->right);}} return result;}
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
完全二叉树

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2 h − 1 2^{h-1} 2h1 个节点

在这里插入图片描述
思路:

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

(1)对于情况一,可以直接用 2 树深度 − 1 2^{树深度 - 1} 2树深度1 来计算,注意这里根节点深度为1。
(2)对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算

在这里插入图片描述
在这里插入图片描述
如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量

关键在于如何去判断一个左子树或者右子树是不是满二叉树

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树
在这里插入图片描述
在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树
在这里插入图片描述
(1)确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型

int getNodeNum(TreeNode* cur)

(2)确定终止条件

if (root == NULL) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftDepth = 0, rightDepth = 0;
while (left)
{left = left->left;leftDepth++;
}
while (right)
{right = right->right;rightDepth++;
}
if (leftDepth == rightDepth)
{return (2 << leftDepth) - 1;
}

(3)单层递归的逻辑

int leftTreeNum = countNodes(root->left);
int rightTreeNum = countNodes(root->right);
int result = leftTreeNum + rightTreeNum + 1;
return result;

C++:

class Solution {
public:int countNodes(TreeNode* root) {if (root == NULL) return 0;int leftDepth = 0, rightDepth = 0;// 这里初始为0是有目的的,为了下面求指数方便TreeNode* left = root->left;TreeNode* right = root->right;while (left)// 求左子树深度{left = left->left;leftDepth++;}while (right)// 求右子树深度{right = right->right;rightDepth++;}if (leftDepth == rightDepth)return (2 << leftDepth) - 1;// 注意(2<<1) 相当于2^2,所以leftDepth初始为0return countNodes(root->left) + countNodes(root->right) + 1; // 左 右 中}
};

时间复杂度: O ( l o g n × l o g n ) O(log n × log n) O(logn×logn)
空间复杂度: O ( l o g n ) O(log n) O(logn)


鼓励坚持十四天的自己😀😀😀

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

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

相关文章

Linux centos7 添加自定义服务(frps服务)

文中以frps为例创建frp服务端的服务 1、创建服务文件 vi /etc/systemd/system/frps.service 注意&#xff1a;文件名frps就是服务名称 2、编辑服务文件内容 [Unit] # 服务名称&#xff0c;可自定义 Description frp server After network.target syslog.target Wants n…

开发者必备21个Python工具

Python作为一门流行的编程语言&#xff0c;拥有着庞大的生态系统和丰富的工具库&#xff0c;为开发者们提供了无限可能。在这篇文章中&#xff0c;我们将介绍21个开发者必备的Python工具&#xff0c;涵盖了开发、调试、测试、性能优化和部署等多个方面。 Python开发工具 Jupyt…

信创认可!沃趣国产数据库云入选“2023 年浙江省信息技术应用创新典型案例”

12月6日&#xff0c;浙江省经信厅公示了2023 年浙江省信息技术应用创新典型案例入围名单&#xff0c;经过征集申报、资格初审、专家评审等环节&#xff0c;遴选出24个优秀典型解决方案&#xff0c;杭州沃趣科技以“基于云原生多类型国产数据库私有云解决方案”成功入选。 浙江省…

【ARM Trace32(劳特巴赫) 使用介绍 14 -- Go.direct 介绍】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 Go.directGo配合程序断点使用Go 配合读写断点使用Go 快速回到上一层函数 System.Mode Go Trace32 Go.direct TRACE32调试过程中&#xff0c;会经常对芯片/内核进行控制&#xff0c;比如全速运行、暂停、单步等等。这篇文章先…

基于hadoop下的spark安装

目录 简介 安装准备 spark安装 配置文件配置 简介 Spark主要⽤于⼤数据的并⾏计算&#xff0c;⽽Hadoop在企业主要⽤于⼤数据的存储&#xff08;⽐如HDFS、Hive和HBase 等&#xff09;&#xff0c;以及资源调度&#xff08;Yarn&#xff09;。但是也有很多公司也在使⽤MR2进…

数据寻址方式

目录 一. 直接寻址二. 间接寻址三. 寄存器寻址四. 寄存器间接寻址五. 隐含寻址六. 立即寻址 \quad 数据寻址, 确定本条指令的地址码指明的真实地址 \quad 假设(下面围绕这个假设展开) \quad 一. 直接寻址 \quad 假设A的位数为16bit 那么寻址范围就是 0 ~ 216-1 \quad 二. 间接…

2023.12.14 hive sql的聚合增强函数 grouping set

目录 1.建库建表 2.需求 3.使用union all来完成需求 4.聚合函数增强 grouping set 5.聚合增强函数cube ,rollup 6.rollup翻滚 7.聚合函数增强 -- grouping判断 1.建库建表 -- 建库 create database if not exists test; use test; -- 建表 create table test.t_cookie(month …

深入浅出讲解半桥栅极驱动器IC FAN7382MX

FAN7382MX是单片高端栅极驱动器IC,可以驱动最高在 600V 下运行的 MOSFET 和 IGBT。安森美的高电压工艺和共模干扰抑制技术提供了高压侧驱动器在高 dv/dt 干扰情况下的稳定运行。先进的电平转换电路可针对 VBS 15V 允许最高 VS -9.8 V&#xff08;典型值&#xff09;的高压侧门…

论文阅读《Domain Generalized Stereo Matching via Hierarchical Visual Transformation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Chang_Domain_Generalized_Stereo_Matching_via_Hierarchical_Visual_Transformation_CVPR_2023_paper.html 概述 立体匹配模型是近年来的研究热点。但是&#xff0c;现有的方法过分依赖特定数据集上…

Lists.partition是如何实现懒加载的?

前言&#xff1a; 最近看到一篇文章&#xff0c;里面提及了google的common包下Lists.partition方法为懒加载&#xff0c;只有在遍历时才会真正分区。平时使用时并未感觉到,感觉有点好奇。特此将自己寻找的答案的过程整理记录下来。 源码&#xff1a; public static <T>…

用友时空 KSOA 多处SQL注入漏洞复现

0x01 产品简介 用友时空 KSOA 是建立在 SOA 理念指导下研发的新一代产品,是根据流通企业前沿的 IT 需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。 0x02 漏洞概述 用友时空 KSOA 系统 PayBill、QueryService、linkadd.jsp等接口处…

“分割“安卓用户,对标iOS,鸿蒙崛起~

近期关于**“华为于明年推出不兼容安卓的鸿蒙版本”**的消息传出&#xff0c;引起了业界的热议关注。自从2019年8月&#xff0c;美国制裁下&#xff0c;华为不再能够获得谷歌安卓操作系统相关付费服务&#xff0c;如此情况下&#xff0c;华为“备胎”鸿蒙操作系统一夜转正。 华…

《数据结构、算法与应用C++语言描述》-最大高度优先左高树-C++实现

左高树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_26maxHblt 定义 (大顶堆和小顶堆)堆结构是一种隐式数据结构(implicit data structure)。用完全二叉树表示的堆在数组中是隐式存储的(即没有明确的指针或其他数据能够用来重塑…

npm安装,idea中启动vue失败

node 设置配置之后&#xff0c;要查询时&#xff0c;会从.npmrc中读取路径 .npmrc自己创建的&#xff08;默认情况下.npmrc会创建在C盘中&#xff09; 我创建的在D:\studay-and-working\node16.14\node_modules\npm中 指定.npmrc文件&#xff0c;因为默认会访问C盘的.npmrc文件…

基于Python数据可视化的网易云音乐歌单分析系统

目录 《Python数据分析初探》项目报告 基于Python数据可视化的网易云音乐歌单分析系统一、项目简介&#xff08;一&#xff09;项目背景&#xff08;二&#xff09;项目过程 二、项目设计流程图&#xff08;一&#xff09;基于Python数据可视化的网易云音乐歌单分析系统的整体…

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

《大模型合规白皮书2023》:为了解大模型立法最新动态和立法趋势提供有价值的参考

本白皮书在我国人工智能法律监管框架下进一步梳理了大模型相关方的合规义务及要点&#xff0c;并展望未来大模型法律监管体系的发展趋势与特征&#xff0c;对政府、企业、社会共建大模型治理体系提出切实建议&#xff0c;从而为社会各界了解大模型立法最新动态和立法趋势提供有…

畅行“一带一路”显担当!苏州金龙获“车轮上的中国”两项大奖

近日, 由中国汽车报社主办的2023商用车产业合作发展大会在北京圆满落幕。作为大会重要组成部分&#xff0c;“2023车轮上的中国——行天下 书担当”年度盛典评选一批为共建“一带一路”作出重大贡献的商用车企业&#xff0c;苏州金龙KLQ6127旅行家、KLQ6106蔚蓝两款车型分别获得…

springboot3.0更新后,idea创建springboot2.x项目

springboot3.0更新后&#xff0c;idea创建springboot2.x项目 点击以下红色框中的按钮 出现了如下图所示&#xff1a; 到这里我们发现没有jdk8的版本&#xff0c;不要慌&#xff0c;我们可以先在这里选择21&#xff0c;然后进入到真正的项目中手动去修改这个jdk的版本&#xff0…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…