二叉树中的奇偶树问题
目录
一·题目:
二·思路汇总:
1.二叉树层序遍历:
1.1题目介绍:
1.2 解答代码(c版):
1.3 解答代码(c++版):
1.4 小结一下:
2.奇偶树分析:
2.1 被leetcode强制否定的思路:
2.2被迫转换的思路:
三·解答代码:
一·题目:
leetcode链接: 1609. 奇偶树 - 力扣(LeetCode)
二·思路汇总:
1.二叉树层序遍历:
1.1题目介绍:
解答这道题,其实首先可以说是和leetcode上的另一道题相关,即二叉树的层序遍历:
leetcode链接:. - 力扣(LeetCode)
对这道题也就不过多解释了,只是用到了这道题的相关代码,可以说是奇偶树是基于这道题。
1.2 解答代码(c版):
//思路:利用队列先进先出,后进后出原则,把树的节点放入,每次取出队列第一个元素,就把它的val按照顺序放入数组
//然后保存并pop掉,放入左右孩子节点(不为NULL),由于是放入二维数组的每一行,故利用for循环,每次计算队列数据个数来控制
//最后注意每次放入二维数组每一行后既for完成一次换行。//接口函数要完成的任务:1·返回层序遍历树得到的按规定的二维数组指针.2·改变并得到二维数组的总行数。3·改变对应的每行的列数typedef struct TreeNode *qdatatype;
typedef struct Qnode {struct Qnode* next;qdatatype data;
}Qnode;
typedef struct queue {int size;Qnode* head;Qnode* tail;
}queue;
void Queueinit(queue* p) {assert(p);p->head = p->tail = NULL;p->size = 0;
}void Queuedestroy(queue* p) {assert(p);Qnode* cur = p->head;while (cur) {Qnode* next = cur->next;free(cur);cur = next;}p->size = 0;p->tail = p->head = NULL;
}
void Queuebackpush(queue* p, qdatatype x) {assert(p);Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL) {perror(malloc);return;}newnode->next = NULL;newnode->data = x;if (p->tail == NULL) {p->head = p->tail = newnode;}else {p->tail->next = newnode;p->tail = newnode;}p->size++;}
qdatatype Queuefrontdata(queue* p) {assert(p);assert(p->size > 0);return p->head->data;
}
bool QueueEmpty(queue* p) {assert(p);return p->size == 0;
}
void Queuefrontpop(queue* p) {assert(p);assert(p->size > 0);if (p->head->next == NULL) {free(p->head);p->head = p->tail = NULL;}else {Qnode* next = p->head->next;free(p->head);p->head = next;}p->size--;
}
int Queuesize(queue* p) {assert(p);return p->size;
}
//以上是开辟的队列int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {* returnSize=0;int**pp=(int**)calloc(2000,sizeof(int*));//利用二级指针来开辟二维数组,首先开辟2000行,可以理解为下面再利用每一行的首地址来开辟每一行的一维数组,即列数if(root==NULL){return NULL;}//空树直接返回NULLqueue q;Queueinit(&q);Queuebackpush(&q, root);//先放入树的根节点int row=0;//树的层数int count=0;//每层树的节点的个数*returnColumnSizes = (int*)malloc(sizeof(int) * 2000);//在外部传的是&arr通过函数来改变数组内的数据,故用二级指针接受//为每行开辟2000个空间while (!QueueEmpty(&q)) {count= Queuesize(&q);//当pop掉上一行所有节点,重新计算队列数据个数即下面要放入数组的每行的数据个数(*returnColumnSizes)[row]=count;//记录每行列数pp[row]=(int*)calloc(count,sizeof(int));//放入数组:得到每行的首地址,在此开辟一维数组,即二维数组每行的列数for(int i=0;i<count;i++){struct TreeNode*ret=Queuefrontdata(&q);pp[row][i]=ret->val;Queuefrontpop(&q);if (ret->left!= NULL) {Queuebackpush(&q, ret->left);}if (ret->right!= NULL) {Queuebackpush(&q, ret->right);}}//利用for循环将上一层节点所连的左右子节点放入,满足队列内数据个数就是下一层的行的列数row++;}Queuedestroy(&q);*returnSize=row;return pp;}
1.3 解答代码(c++版):
//思路:把树的节点入队列,每次队列数据入v后pop调,之后拉进它的左右孩子入队,队列的大小就是二维数组每行的数据数,依次两个循环嵌套。
class Solution{
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<int>v;vector<vector <int>>vv;queue<TreeNode*> q;if(root==NULL){return vv;}q.push(root);while(!q.empty()){int size=q.size();int count=size;//记录每行大小也是push——back次数v.clear();//刷新v里面的数据while(count--){//vv[row].push_back(q.front()->val);因为一开始定义的vv没有开辟空间,故不能这样用下标访问,只有下面的push_back才//开了空间,故可以直接插入数据。类似于用malloc给指针开辟空间,再用下标访问,而这里相当于用malloc故访问越界v.push_back(q.front()->val);TreeNode*tmp=q.front();//保存节点指针方便后面pushq.pop();if(tmp->left!=NULL){q.push(tmp->left);}if(tmp->right!=NULL){q.push(tmp->right);}}vv.push_back(v);//每push完一层就加到vector后面。}return vv;}
};
1.4 小结一下:
根据对于同一道题的解答代码长度和复杂度上,明显c++直接占极大优势,感觉当初花很长时间的c代码直接让c++代码瞬间秒杀,而且难度也减小,不亏是c的升级版,感觉爱不释手了。
2.奇偶树分析:
2.1 被leetcode强制否定的思路:
先说一下一开始吧,本以为,如果先把它按照层序遍历到二维数组的话,后面再对已知条件进行一次判断的话,本来以为可以通过(当看到测试用例过了):
然而当提交的时候,果然还是被leetcode给算计住了(其实当看到val精确到10^6就觉得可能会来这一套,说实话也没太出乎意料吧):
这里用了简单hash表以及is_sorted() 等最后来判断是否符合,不过这下子只能换思路咯!
错误代码(仅参考一下这个思路吧,不过也pass掉咯):
class Solution {
public:bool isEvenOddTree(TreeNode* root) {vector<int>v;vector<vector <int>>vv;queue<TreeNode*> q;if (root == NULL) {return false;}q.push(root);while (!q.empty()) {int size = q.size();int count = size;//记录每行大小也是push——back次数v.clear();//刷新v里面的数据while (count--) {//vv[row].push_back(q.front()->val);因为一开始定义的vv没有开辟空间,故不能这样用下标访问,只有下面的push_back才//开了空间,故可以直接插入数据。类似于用malloc给指针开辟空间,再用下标访问,而这里相当于用malloc故访问越界 v.push_back(q.front()->val);TreeNode* tmp = q.front();//保存节点指针方便后面pushq.pop();if (tmp->left != NULL) {q.push(tmp->left);}if (tmp->right != NULL) {q.push(tmp->right);}}vv.push_back(v);//每push完一层就加到vector后面。}if(vv[0][0]%2==0){return false;}for(int i=0;i<vv.size();i++){int hash[1000001]={0};for(int j=0;j<vv[i].size();j++){if(i%2==0&&vv[i][j]%2==0){return false;}if(i%2!=0&&vv[i][j]%2!=0){return false;}if(hash[vv[i][j]]>=1){return false;}hash[vv[i][j]]++;}if(i%2==0){if(is_sorted(vv[i].begin(),vv[i].end(),less<int>())){}else{return false;}}else{if(is_sorted(vv[i].begin(),vv[i].end(),greater<int>())){}else{return false;}}}return true;}
};
2.2被迫转换的思路:
下面于是就想着可以在放入内部嵌套的vector 的过程中来判断是否符合。
由于把它依靠队列放入vector模拟的二维数组再判断奇偶层对应的奇偶数已经严格递增的话可能超过了时间限制,故可以换个思路,考虑当由队列放入v中就按照顺序筛选,(由于只要出现一种不符合条件的情况,它就不是奇偶数,故找到不合题意就直接给它false,剩下的直接最后true就OK)
筛选条件:level要么是奇数要么是偶数,为奇的话,插入的数据应该是偶,为偶的话,插入的数据应该是奇,否则直接false。 偶奇:如果是第一个先直接插入,但是也要有个比较v中的数据要小于要插入的才插入,否则也直接false。
同理 奇偶也是如此:如果是第一个先直接插入,但是也要有个比较v中的数据要大要插入的才插入,否则也直接false。
步骤总结:
1.先模拟二叉树进入vector模拟的二维数组过程
2.进入vector的时候加上筛选条件
最后也是成功被leetcode放行通过了:
尽管这种方法效率有点低吧!!!
三·解答代码:
class Solution {
public:bool isEvenOddTree(TreeNode* root) {vector<int>v;vector<vector <int>>vv;queue<TreeNode*> q;if (root == NULL) {return false;}q.push(root);int row = -1;while (!q.empty()) {int size = q.size();row++;//记录level的值int count = size;//记录每行大小也是push——back次数v.clear();//刷新v里面的数据while (count--) {//vv[row].push_back(q.front()->val);因为一开始定义的vv没有开辟空间,故不能这样用下标访问,只有下面的push_back才//开了空间,故可以直接插入数据。类似于用malloc给指针开辟空间,再用下标访问,而这里相当于用malloc故访问越界 if (row % 2 == 0 && q.front()->val % 2 != 0) {//判断为偶奇if (v.size() == 0) {v.push_back(q.front()->val);}else if (v.end() == find(v.begin(), v.end(), q.front()->val) && v[v.size() - 1] < q.front()->val){v.push_back(q.front()->val);//判断严格升序}else {return false;//非严格升序}}else if (row % 2 != 0 && q.front()->val % 2 == 0) {//判断为奇偶if (v.size() == 0) {v.push_back(q.front()->val);}
else if (v.end() == find(v.begin(), v.end(), q.front()->val) && v[v.size() - 1]> q.front()->val){v.push_back(q.front()->val);//判断严格降序}else {return false;//非严格降序}}else {//非->直接返falsereturn false;}TreeNode* tmp = q.front();//保存节点指针方便后面pushq.pop();if (tmp->left != nullptr) {q.push(tmp->left);}if (tmp->right != nullptr) {q.push(tmp->right);}}vv.push_back(v);//每push完一层就加到vector后面。}return true;}
};
相关文章:
二叉树中的奇偶树问题
目录 一题目: 二思路汇总: 1.二叉树层序遍历: 1.1题目介绍: 1.2 解答代码(c版): 1.3 解答代码(c版): 1.4 小结一下: 2.奇偶树分析…...
GD - EmbeddedBuilder - 用DMA进行串口发送接收,支持接收不定长包
文章目录 GD - EmbeddedBuilder - 用DMA进行串口发送接收,支持接收不定长包概述笔记硬件连接图形化配置485EN的配置串口的图形化配置 代码实现main.cgd32f3x0_hal_it.cgd32f3x0_hal_init.cgd32f3x0_hal_init.hgd32f3x0_hal_it.hgd32f3x0_libopt.h 备注END GD - Embe…...
英语中apartment(公寓)(美式)、house(房子)、flat(公寓)(英式)、villa(别墅)、room(房间)区别
文章目录 英语中apartment、house、flat、villa、room区别 英语中apartment、house、flat、villa、room区别 在英语中,“apartment”、“house”、“flat”、“villa”、和 “room” 这些词语都与居住空间有关,但它们各自的含义和用途有所不同ÿ…...
黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)
1. 组件缓存 1.1 介绍 先来看一个问题? 从首页切换到我的,再从我的回到首页,我们发现首页重新渲染原来的状态没有了。 首先,这是正常的状态,并非问题,路由在切换的时候会销毁切出去的页面组件ÿ…...
《AI视频类工具之一—— 即创》
一.简介 官网:即创 - 一站式智能创意生产与管理平台 即创是字节跳动(现更名为抖音集团)旗下的一款一站式智能创意生产与管理平台,旨在帮助用户高效地进行创意内容的生成、管理和分析。 二.功能介绍 视频创作: 智能成片:利用AI技术自动编辑视频片段,快速生成完整的视频…...
CSS的:host伪类:精确定位于Web组件的指南
随着Web组件技术的发展,自定义元素(Custom Elements)已经成为现代Web开发中不可或缺的一部分。CSS的:host伪类为Web组件的样式封装提供了一种强大的工具,它允许开发者为自定义Web组件的宿主元素定义样式。本文将详细介绍:host伪类…...
安卓sdk manager下载安装
安卓sdk下载安装 android SDK manager下载 环境变量配置 ANDROID_HOME:D:\Android %ANDROID_HOME%\tools %ANDROID_HOME%\platform-tools %ANDROID_HOME%\build-tools\29.0.3Android SDK Platform-tools公用开发工具包,需要下载 Android SDK Tools基础…...
CV学习笔记3-图像特征提取
图像特征提取是计算机视觉中的一个关键步骤,其目标是从图像中提取有意义的特征,以便进行进一步的分析或任务,如分类、检测、分割等。特征提取可以帮助减少数据的维度,同时保留重要的信息。以下是常见的图像特征提取方法和技术&…...
Git使用方法(三)---简洁版上传git代码
1 默认已经装了sshWindows下安装SSH详细介绍-CSDN博客 2 配置链接github的SSH秘钥 1 我的.ssh路径 2 进入路径cd .ssh 文件 3 生成密钥对 ssh-keygen -t rsa -b 4096 (-t 秘钥类型 -b 生成大小) 输入完会出现 Enter file in which to save the key (/c/Users/Administrator/…...
8.21-部署eleme项目
1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…...
多目标跟踪之ByteTrack论文(翻译+精读)
ByteTrack:通过关联每个检测框进行多对象跟踪 摘要 翻译 多对象跟踪(MOT)旨在估计视频中对象的边界框和身份。大多数方法通过关联分数高于阈值的检测框来获取身份。检测分数低的物体,例如被遮挡的物体被简单地丢弃,…...
【实践】Java开发常用工具类或中间件
在Java开发中,有许多常用的工具类和中间件,它们可以显著提高开发效率,简化代码,并提供强大的功能。这些工具类和中间件广泛应用于各种类型的Java应用程序中,包括Web应用、企业级应用、微服务等。以下是一些在Java开发中…...
Vue2移动端(H5项目)项目封装车牌选择组件
一、最终效果 二、参数配置 1、代码示例: <t-keyword:isShow"isShow"ok"isShowfalse"cancel"isShowfalse"inputchange"inputchange":finalValue"trailerNo"/>2、配置参数(TKeyword Attribute…...
四川财谷通信息技术有限公司抖音小店的优势
在数字化浪潮的推动下,电商行业迎来了前所未有的发展机遇,而抖音小店作为新兴的电商平台,凭借其独特的社交属性和便捷的购物体验,迅速赢得了广大消费者的青睐。在众多抖音小店中,四川财谷通信息技术有限公司旗下的抖音…...
2025届八股文:计算机网络高频重点面试题
鉴于排版复杂且篇幅过长,本文仅列举出问题,而未给出答案,有需要答案的同学可后台私信。整理总结不易,请尊重劳动成果,转载请注明出处。 目录 网络基础 HTTP TCP UDP IP PING WebSocket DNS 网络安全 网络基础…...
嵌入式和单片机有什么区别?
目录 (1)什么是嵌入式? (2)什么是单片机? (3)嵌入式和单片机的共同点 (4)嵌入式和单片机的区别 (1)什么是嵌入式? 关…...
JSON.stringify 和 JSON.parse
JSON.stringify 是一个将 JavaScript 对象转换为 JSON 字符串的方法,它有三个参数: JSON.stringify(value, replacer, space) 参数详解 value (必需): 这是你想要转换为 JSON 字符串的 JavaScript 对象或数组。例如:…...
APP架构设计_2.用MVVM架构实现一个具体业务
2.MVVM架构图 3.MVVM 实现一个具体业务 3.1 界面层的实现 界面层实现时,需要遵循以下几点。 1)选择实现界面的元素 界面元素可以用 view 或 compose 来实现,这里用 view 实现。 2)提供一个状态容器 这里使用 ViewModel 作为状态容…...
安恒信息总裁宋端智,辞职了!活捉一枚新鲜出炉的餐饮人!
吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…...
《javaEE篇》--定时器
定时器概念 当我们不需要某个线程立刻执行,而是在指定时间点或指定时间段之后执行,假如我们要定期清理数据库里的一些信息时,如果每次都手动清理的话就太麻烦,所以就可以使用定时器。定时器就可以比作一个闹钟,可以让…...
OpenLayers3, 缩放、平移、复位操作
文章目录 一、前言二、代码示例 一、前言 本文基于OpenLayers3实现地图缩放、平移和复位操作 二、代码示例 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htm…...
进程与线程(7)
IPC通信方式: 一、共享内存 system v : 共享内存 是一块,内核预留的空间 最高效的通信方式 (避免了用户空间 到 内核空间的数据拷贝) 二、IPC对象操作通用框架: key值 > 申请 》读写 》关闭 》卸载 1.ftok函数:…...
传知代码-自动化细胞核分割与特征分析(论文复现)
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 引言 细胞核分割和分类在医学研究和临床诊断中具有重要意义。精准的细胞核分割能够帮助医生更好地识别和分析细胞核的形态学特征,从而辅助疾病诊断、癌症检测以及药物研发。HoverNet是一种基于深度学…...
Vue UI - 可视化的Vue项目管理器
概述 Vue CLI 3.0 更新后,提供了一套全新的可视化Vue项目管理器 —— Vue UI。所以要想使用它,你的 Vue CL I版本必须要在v3.0以上。 一、启动Vue UI 1.1 环境准备 1.1.1 安装node.js 访问官网(外网下载速度较慢)或 http://nod…...
团队管理之敏捷开发
一、敏捷实践 敏捷开发中一直秉承的理念和宣言是:我们正在通过亲身实践以及帮助他人实践,揭示更好的软件开发方法。通过这项工作,我们认为:个体和交互胜过过程和工具、可以工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、…...
Hive3:表的常用修改语句
1、表重命名 ALTER TABLE old_table_name RENAME TO new_table_name;如: ALTER TABLE score4 RENAME TO score5;2、修改表属性值 ALTER TABLE table_name SET TBLPROPERTIES table_properties; table_properties:: (property_name property_value, property…...
MidJourney付费失败的原因以及失败后如何取消或续订(文末附MidJourney,GPT-4o教程)
MidJourney付费失败的原因 MidJourney付费失败的原因可能包括支付方式无效、支付信息错误、网络问题、账户设置问题等。 支付方式无效或信息错误:如果用户提供的支付方式(如信用卡)信息不正确,或者支付方式本身不支持该地区…...
PHP安全开发
安全开发 PHP 基础 增:insert into 表名(列名 1, 列名 2) value(‘列 1 值 1’, ‘列 2 值 2’); 删:delete from 表名 where 列名 ‘条件’; 改:update 表名 set 列名 数据 where 列名 ‘条件’; 查:select * from 表名 wher…...
【大模型从入门到精通32】开源库框架LangChain RAG 系统中的问答技术2
这里写目录标题 探索高级问答链类型MapReduce 和 Refine 技术 实用建议和最佳实践解决 RetrievalQA 限制结论进一步阅读和探索理论问题实践问题 探索高级问答链类型 MapReduce 和 Refine 技术 MapReduce 和 Refine 是设计用来规避由语言模型 (LM) 上下文窗口大小所导致的限制…...
MySQL 数据库管理
在 MySQL 中,数据库管理是非常基础但又至关重要的技能。无论是创建新的数据库、选择当前使用的数据库,还是查看数据库的相关信息,这些操作都是日常数据库管理中不可或缺的一部分。本文将详细介绍 MySQL 数据库管理的基本操作,包括…...
怎么让网站快速被收录/百度广告怎么投放多少钱
Web测试 Web通常指的是互联网应用系统,比如税务电子化征管档案系统、金融数据平台、餐饮商家管理后台等等,其实质是C/S的程序。 C是Client——客户端,S是Server——服务器。 Web中的客户端一般指的是Browser——浏览器,也就是B…...
常见网站安全漏洞/seo工具在线访问
neo4j-w3cschool教程 neo4j初次使用学习简单操作-cypher语言使用...
广州设计公司网站/品牌形象推广
2017全国计算机等级考试一级WPS office考试大纲NCRE(WPS Office)是全国计算机等级考试体系(NCRE)的入门级。下面是YJBYS小编整理的2017全国计算机等级考试一级WPS office考试大纲,希望对你有帮助!考试大纲:1.具有使用微型计算机的基础知识(包…...
用什么l软件做网站了/seo搜索引擎优化平台
</pre>基于目前业务的版本,使用的maven 及tomcat <p></p><p>如果我们使用 Jenkins 发布是比较好的,但是存在一定的问题,就是需要学习时间,</p><p>基于我们的项目,我使用python 自…...
大气宏伟wordpress企业主题/电脑优化
文章目录1. 前言2. 操作2.1. PC端2.1.1. 安装Python环境2.1.2. 调试代码2.1.3. 设置开机启动2.2. HMS Core API申请2.2.1. 注册账号2.2.2. 创建应用2.2.3. 填写基本信息2.2.4. 填写应用信息2.2.4.1. 软件图标2.2.4.2. 应用的截图2.2.4.3. 应用分类2.2.5. API信息设置2.2.5.1. 添…...
重庆家居网站制作公司/百度移动端模拟点击排名
二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到 的时间复杂度。 前提条件 必须有序。一般是从小到大有序。 坑点 计算中间值导致的数据越界。一般我们…...