代码随想录day19day20打卡

二叉树

1 二叉树的最大深度和最小深度

最大深度已经学习过了,实质就是递归的去判断左右子节点的深度,然后对其进行返回。
附加两个学习的部分:
(1)使用前序遍历的方法求解

int result;
void getdepth(TreeNode* node, int depth){result = depth > result ? depth : result;if(node->left == NULL && node->right==NULL)return ;if(node->left){ //左节点深度depth++; //深度+1getdepth(node->left, depth);depth--; //此处需要进行回溯}if(node->right){depth++;getdepth(node->right, depth);depth--; //此处需要进行回溯	}return ;
}
int maxDepth(TreeNode* root){result = 0;if(root == NULL)return result;getdepth(root,1);return result;
}

(2)迭代法,使用层序遍历
即只需要记录遍历的层数即可

int maxDepth(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);}}return depth;
}

最小深度题目:
在这里插入图片描述

在递归法当中,要注意左子树不存在或者是右子树不存在的问题,其余的按照最大深度的模版套用即可。

//后序遍历
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;}if(node->left != NULL && node->right != NULL){return 1+min(leftDepth,rightDepth);}
}
int minDepth(TreeNode* root){return getDepth(root);
}//前序遍历
class Solution {
private:int result;void getdepth(TreeNode* node, int depth) {// 函数递归终止条件if (node == nullptr) {return;}// 中,处理逻辑:判断是不是叶子结点if (node -> left == nullptr && node->right == nullptr) {result = min(result, depth);}if (node->left) { // 左getdepth(node->left, depth + 1);}if (node->right) { // 右getdepth(node->right, depth + 1);}return ;}public:int minDepth(TreeNode* root) {if (root == nullptr) {return 0;}result = INT_MAX;getdepth(root, 1);return result;}
};

迭代法只需增加一个条件,就是到这个节点时,左右子都为空,那么可以返回这个深度。

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;}

2 完全二叉树的节点个数

3 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]
返回true

复习二叉树节点的深度和高度。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

一般定义根节点的深度为1。求深度可以从上到下进行查找,需要进行前序遍历(中左右)。而求高度只能从下到上去查,所以只能后序遍历(左右中)。

回顾求取二叉树的最大深度

class solution{
public:int result;void getDepth(TreeNode* node, int depth){result = depth > reusult ? depth : result;if(node->left == NULL && node->right == NULL) return ;if(node->left){depth++;getDepth(node->left,depth);depth--;}if(node->right){depth++;getDepth(node->right,depth);depth--;}return ;}int maxDepth(TreeNode* root){result = 0;if(root == NULL)return result;getDepth(root, 1);return result;}
};

递归法
1)明确递归函数的参数和返回值:那么参数一定是当前的节点,并且需要返回以当前传入节点为根节点的树的高度。int getHeight(TreeNode* node)
2)终止条件:既需要遇到空节点。if(node==NULL) return 0;
3)确认单层递归的逻辑:只需要判断左子树和右子树的高度差即可。

int leftHeight = getHeight(node->left);
if(leftHeight == -1)return -1;
int rightHeight= getHeight(node->right);
if(rightHeight== -1)return -1;
int result;
if(ans(leftHeight - rightHeight) > 1) return -1;
else result = 1 + max(leftHeight,rightHeight);
return result;

最终代码:

class Solution {
public:// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1int getHeight(TreeNode* node) {if (node == NULL) {return 0;}int leftHeight = getHeight(node->left);if (leftHeight == -1) return -1;int rightHeight = getHeight(node->right);if (rightHeight == -1) return -1;return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);}bool isBalanced(TreeNode* root) {return getHeight(root) == -1 ? false : true;}
};

4 二叉树的所有路径(回溯算法)

给定一个二叉树,返回所有从根节点到叶子节点的路径。

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

在这里插入图片描述
要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

前序遍历以及回溯的过程如图:
加粗样式
递归回溯法
1)明确递归函数的参数和返回值:需要传入根节点,记录每一条路径的path以及结果集result,不需要返回值。
2)终止条件:既需要遇到节点的左右子均为空。当遇到这个情况的时候,需要将之前遍历的节点存入数组当中,并且还需要将其转化为string,存入result。
3)确认单层递归的逻辑:即遍历过程中需要将遍历的path存入数组,因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。path.push_back(cur->val);
然后是递归和回溯的过程,上面说过没有判断cur是否为空,那么在这里递归的时候,如果为空就不进行下一层递归了。所以递归前要加上判断语句,下面要递归的节点是否为空,同时需要进行回溯,也就是要把这个path弹出去,如下:

if (cur->left) {traversal(cur->left, path, result);path.pop_back(); // 回溯
}
if (cur->right) {traversal(cur->right, path, result);path.pop_back(); // 回溯
}

整体的代码如下:

class Solution {
private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 // 这才到了叶子节点if (cur->left == NULL && cur->right == NULL) {string sPath;for (int i = 0; i < path.size() - 1; i++) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return;}if (cur->left) { // 左 traversal(cur->left, path, result);path.pop_back(); // 回溯}if (cur->right) { // 右traversal(cur->right, path, result);path.pop_back(); // 回溯}}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;traversal(root, path, result);return result;}
};

代码精简:

class Solution {
private:void traversal(TreeNode* cur, string path, vector<string>& result) {path += to_string(cur->val); // 中if (cur->left == NULL && cur->right == NULL) {result.push_back(path);return;}if (cur->left) traversal(cur->left, path + "->", result); // 左if (cur->right) traversal(cur->right, path + "->", result); // 右}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;string path;if (root == NULL) return result;traversal(root, path, result);return result;}
};

5 左叶子之和

计算给定二叉树的所有左叶子之和。

示例:

在这里插入图片描述
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子

递归回溯法
1)明确递归函数的参数和返回值:需要传入根节点,返回值为数值之和
2)终止条件:遇到空节点,返回0。
3)确认单层递归的逻辑:遇到左叶子存入该值,然后通过递归求取左子树左叶子之和与右子树左叶子之和。

int sumOfLeftLeaves(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right== NULL) return 0;int leftValue = sumOfLeftLeaves(root->left);    // 左if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况leftValue = root->left->val;}int rightValue = sumOfLeftLeaves(root->right);  // 右int sum = leftValue + rightValue;               // 中return sum;}

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

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

相关文章

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

酷得智能电子方案 早教学习机

早教学习机是用户友好的&#xff0c;易于操作&#xff0c;同时要确保内容的科学性和适宜性&#xff0c;以促进儿童的健康成长和智力发展。 通常包括以下几个方面&#xff1a; 1.年龄分级内容&#xff1a;软件会根据儿童的不同年龄段提供相应的教育内容&#xff0c;从新生儿到…

Qt---day2-信号与槽

1、思维导图 2、 拖拽式 源文件 #include "mywidget.h" #include "ui_mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MyWidget) { ui->setupUi(this); //按钮2 this->btn2new QPushButton("按钮2",th…

25考研英语长难句Day02

25考研英语长难句Day02 【a.词组】【b.断句】 如果你是你讲话对象中的一员&#xff0c;你就能了解你们大家共同的经历和问题&#xff0c;你也可以顺便评论一下食堂里难吃的食物或董事长臭名昭著的领带品味。 【a.词组】 单词解释addressv. 演说&#xff0c; 演讲&#xff1b;…

Linux学习之路 -- 文件 -- 文件描述符

前面介绍了与文件相关的各种操作&#xff0c;其中的各个接口都离不开一个整数&#xff0c;那就是文件描述符&#xff0c;本文将介绍文件描述符的一些相关知识。 目录 <1>现象 <2>原理 文件fd的分配规则和利用规则实现重定向 <1>现象 我们可以先通过prin…

“视频号小店”和“抖音小店”新手做电商选择哪个更好?

哈喽~我是电商月月 做电商的老商家和&#xff0c;准备做电商的新手朋友都知道现在最大的电商平台就是“抖音小店” 但抖店小店毕竟发展了四年&#xff0c;流量多&#xff0c;商家也多&#xff0c;最近又崛起了一个新黑马“视频号小店” 那到底去哪个平台发展才有前景呢&…

机器学习项目实践-基础知识部分

环境建立 我们做项目第一步就是单独创建一个python环境&#xff0c;Python新的隔离环境 创建&#xff1a;python -m venv ml 使用&#xff1a;.\Scripts\activate python -m venv ml 是在创建一个名为 ml 的虚拟环境&#xff0c;这样系统会自动创建一个文件夹ml&#xff0c;…

AGV无人叉车 | 我们为什么要投资“智慧生产”

AGV 作为一种智能工业车辆机器人&#xff0c;无人叉车充分融合叉车技术和AGV技术&#xff0c;近年来在仓储物流领域的应用逐步扩大。在传统叉车厂商、传统AGV厂商、物流集成商及仓储机器人企业等各方力量推动下&#xff0c;无人叉车市场在竞合中快速发展&#xff0c;并促使无人…

优雅的实现接口统一调用!

有些时候我们在进行接口调用的时候&#xff0c;比如说一个 push 推送接口&#xff0c;有可能会涉及到不同渠道的推送。 比如做结算后端服务的&#xff0c;会与金蝶财务系统进行交互&#xff0c;那么我结算后端会涉及到多个结算单类型&#xff0c;如果每一个种类型的结算单都去…

如果insightface/instantID安装失败怎么办(关于InsightFaceLoader_Zho节点的报错)

可能性有很多&#xff0c;但是今天帮朋友解决问题的时候又收集了一种新的思路。 首先&#xff0c;可以先按照这篇文章里边提到的方法去安装&#xff1a; 【全网最详细】ComfyUI下&#xff0c;Insightface安装指南-聚梦小课堂_insightface如何安装-CSDN博客 其次&#xff0c;…

使用IIS部署Vue项目

前提 使用IIS部署Vue项目&#xff0c;后端必须跨域&#xff0c;不要在Vue中用proxy跨域&#xff0c;那个只在dev环境中有用&#xff01; IIS安装&#xff0c;不用全部打勾&#xff0c;有些他默认就是方块 ■ 选择性安装的&#xff0c;就维持原样就可以。 添加网站配置 右键…

Springboot项目学习之各组件的用法和逻辑结构

1.Controller层&#xff08;Controller&#xff09;&#xff1a; 也称为前端控制器或请求处理器&#xff0c;它是项目与用户交互的入口。Controller接收HTTP请求&#xff0c;解析请求参数&#xff0c;调用Service层处理业务逻辑&#xff0c;并返回响应给客户端。 Controller通…

告别杂乱桌面,开启纯净视界!DeskCover Pro,Mac用户的桌面神器!

DeskCover Pro for Mac是一款专为macOS设计的桌面图标隐藏软件&#xff0c;其主要功能和特点包括&#xff1a; 桌面图标隐藏&#xff1a;通过单击鼠标或按全局热键&#xff0c;可以快速隐藏桌面上的所有图标&#xff0c;为您提供一个干净整洁的工作环境。窗口聚焦&#xff1a;…

第十四届蓝桥杯大赛软件赛省赛(Python大学A组)

2023年蓝桥杯 省赛真题Python大学A组 试题A&#xff1a;特殊日期 试题B&#xff1a;分糖果 试题C&#xff1a;三国游戏 试题D&#xff1a;平均 试题E&#xff1a;翻转 试题F&#xff1a;子矩阵 试题G&#xff1a;阶乘的和 …

关于2024年东北教育装备展示会(沈阳)参展通知

2024年东北教育装备展示会 邀请函 数字赋能新时代 共创教育新未来 时间&#xff1a;2024年6月28-30日 地点&#xff1a;沈阳国际展览中心&#xff08;沈阳市苏家屯-会展路9号&#xff09; 展览面积&#xff1a;30000平方米 参展商数&#xff1a;260家 预计观众&#xff1…

第8篇:创建Nios II工程之读取Switch的值<一>

Q&#xff1a;本期我们再添加一个PIO组件设为输入&#xff0c;创建Nios II工程读取输入值显示在LED上。 A&#xff1a;在前2期创建的控制LED工程的Platform Designer系统基础上再添加一个PIO核&#xff0c;参数设置为18位和单向输入模式&#xff0c;表示DE2-115开发板上的18个…

做题速度太慢了,面不上

没办法&#xff0c;之前练了一个月的sql。两个月不写&#xff0c;现在差不多忘干净了。工作空窗期&#xff0c;或者休息期不能太久&#xff0c;不然学再多的内容都可能会忘完的。 sql题&#xff0c;腾讯四道sql题&#xff0c;限时45分钟完成。我只做了一道&#xff0c;还没做完…

vivado刷题笔记46

题目&#xff1a; Design a 1-12 counter with the following inputs and outputs: Reset Synchronous active-high reset that forces the counter to 1 Enable Set high for the counter to run Clk Positive edge-triggered clock input Q[3:0] The output of the counter c…

从零开始的软件测试学习之旅(六)测试网络基础知识

测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…

ffmpeg音视频裁剪

音视频裁剪&#xff0c;通常会依据时间轴为基准&#xff0c;从某个起始点到终止点的音视频截取出来&#xff0c;当然音视频文件中存在多路流&#xff0c;所对每一组流进行裁剪 基础概念&#xff1a; 编码帧的分类&#xff1a; I帧(Intra coded frames): 关键帧&#xff0c;…