二叉树中的奇偶树问题

目录

一·题目:

二·思路汇总:

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

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

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

相关文章

推荐一个开源的kafka可视化客户端GUI工具(Kafka King)

大佬的博客地址&#xff1a; https://blog.ysboke.cn/posts/tools/kafka-king Github地址&#xff1a; https://github.com/Bronya0/Kafka-King Kafka-King功能清单 查看集群节点列表&#xff08;完成&#xff09;支持PLAINTEXT、SASL PLAINTEXT用户名密码认证&#xff08;完…

Python 如何创建和解析 XML 文件

XML&#xff08;可扩展标记语言&#xff09;是一种广泛使用的标记语言&#xff0c;主要用于存储和传输数据。它具有结构化、层次化的特点&#xff0c;常被用作数据交换格式。Python 提供了多种工具和库来处理 XML 文件&#xff0c;包括创建、解析和操作 XML 文档。 一、XML 简…

qt-13 进度条(模态和非模态)

进度条-模态和非模态 progressdlg.hprogressdlg.cppmain.cpp运行图模态非模态 progressdlg.h #ifndef PROGRESSDLG_H #define PROGRESSDLG_H#include <QDialog> #include <QLabel> #include <QLineEdit> #include <QProgressBar> #include <QCombo…

人物形象设计:塑造独特角色的指南

引言 人物形象设计是一种创意过程&#xff0c;它利用强大的设计工具&#xff0c;通过视觉和叙述元素塑造角色的外在特征和内在性格。这种设计不仅赋予角色以生命&#xff0c;还帮助观众或读者在心理层面上与角色建立联系。人物形象设计的重要性在于它能够增强故事的吸引力和说…

p8 Run的流程和Docker原理

docker run的运行原理图 docker是怎么工作的&#xff1f; docker是一个cs的一个结构的系统docker的守护进程运行在宿主机上面通过socket进行访问 其实就是看下面的这个图&#xff0c;通过客户端的命令来操作docker的守护进程然后启动一些容器&#xff0c;默认容器是不启动的 …

网络基础概念【网络】

文章目录 网络协议协议分层 OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型同局域网的两台主机通信数据包封装和解包分用&#xff08;数据段&#xff0c;数据报&#xff0c;数据帧&#xff09;网络中的地址管理 网络协议 协议分层 网络协议栈设计成层状结构&#…

【学习笔记】Day 20

一、进度概述 1、机器学习常识12-18&#xff0c;以及相关代码复现 二、详情 12、SVM&#xff08;support vector machines&#xff0c;支持向量机&#xff09; 实际上&#xff0c;支持向量机是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;…

如何将CSDN文章导出为pdf文件

第一步&#xff1a; 打开想要导出的页面&#xff0c;空白处点击鼠标右键⇒点击“检查”或“check”&#xff0c;或直接在页面按F12键。 第二步&#xff1a; 复制以下代码粘贴到控制台&#xff0c;并按回车。 若提示让输入“允许粘贴”或“allow pasting”&#xff0c;按提示…

百度地图路书实现历史轨迹回放、轨迹回放进度、聚合点、自定义弹框和实时监控视频、多路视频轮巡播放

前言 分享一个刚做完项目集成技术&#xff0c;一个车辆行驶轨迹监控、行车视频监控、对特种车辆安全监管平台&#xff0c;今年政府单位有很多监管平台项目&#xff0c;例如&#xff1a;渣土车监控、租出车监管、危害气体运输车监管等平台&#xff0c;这些平台都有车辆行驶轨迹…

Linux基础知识学习(五)

1. 用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户…

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…

音频采集spring_ws_webrtc (html采集麦克风转gb711并发送广播播放)完整案例

下载地址&#xff1a;http://www.gxcode.top/code 项目说明 springbootwebscoektwebrtc 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并…

mac如何恢复被同名替换掉的文件夹 mac文件被替换如何恢复

Mac系统一直以高性能遥遥领先其他的Windows系统&#xff0c;因此&#xff0c;Mac虽然价格远远高出其他的笔记本电脑&#xff0c;但是还是受到了一众用户的青睐。使用mac时&#xff0c;我们也经常会将一个文件命名为已经有了相同文件的文件名&#xff0c;且保存到同一个目标地址…

MATLAB-PSO-BiTCN-BiLSTM-Attention多变量分类

一、数据集 数据特征&#xff1a;12个多分类&#xff1a;4分类 ​ 二、PSO-BiTCN-BiLSTM-Attention网络 PSO-BiTCN-BiLSTM-Attention 网络是一种结合了多种深度学习技术和优化算法的复杂模型&#xff0c;用于处理时序数据任务&#xff0c;如时间序列预测、分类或其他相关问题…

【Linux】——进程概念(万字解读)

一 冯诺依曼体系结构 在此之前&#xff0c;我们先要理解我们计算机的冯诺依曼体系结构&#xff0c;因为是进程的基础 我们所有的操作其实都是基于这样一个模型&#xff0c;比如你在qq上&#xff0c;和别人发送消息&#xff0c;这个消息肯定是先通过输入设备进行输入&#xf…

一个注解轻松搞定审计日志服务!

【审计日志】&#xff0c;简单的说就是系统需要记录谁&#xff0c;在什么时间&#xff0c;对什么数据&#xff0c;做了什么样的更改&#xff01;任何一个 IT 系统&#xff0c;如果要过审&#xff0c;这项任务基本上也是必审项&#xff01; 实现【审计日志】这个需求&#xff0…

整体思想以及取模

前言&#xff1a;一开始由于失误&#xff0c;误以为分数相加取模不能&#xff0c;但是其实是可以取模的 这个题目如果按照一般方法&#xff0c;到达每个节点再进行概率统计&#xff0c;但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…

联想闪电鲨移动硬盘文件没删除却消失了怎么办

在日常的数据存储与管理中&#xff0c;移动硬盘作为便携且容量可观的存储设备&#xff0c;深受用户青睐。然而&#xff0c;当您发现联想闪电鲨移动硬盘中的文件突然消失&#xff0c;而您确信并未进行删除操作时&#xff0c;这无疑会令人感到困惑与焦虑。本文旨在为您揭开这一谜…

vue-element-admin——<keep-alive>不符合预期缓存的原因

vue-element-admin——<keep-alive>不符合预期缓存的原因 本文章&#xff0c;以现在中后台开发用的非常多的开源项目vue-element-admin为案例。首先&#xff0c;列出官方文档与缓存<keep-alive>相关的链接&#xff08;请认真阅读&#xff0c;出现缓存<keep-ali…

在IEDA里打包Maven项目记录

之前在网上查找到的方式发现比较繁琐&#xff0c;所以把自己的解决办法记录一下分享给兄弟们 <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</vers…