C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树

965. 单值二叉树 - 力扣(LeetCode)

建立一个新的函数,用函数传参的方法来记录val的值

如上一篇最后的对称二叉树的习题,建立新的函数来传参

多采用使用反对值的方法,因为如果是相等return true的话,没有实质性的作用 

bool _isUnivalTree(struct TreeNode* root,const int val){if(root==NULL){return true;}if(root->val!=val){return false;}return _isUnivalTree(root->left,val)&&_isUnivalTree(root->right,val);}
bool isUnivalTree(struct TreeNode* root) {if(root==NULL){return true;}int val=root->val;return _isUnivalTree(root,val);
}

2.前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

力扣的统一要求,凡是返回数组,一定要返回数组大小

这样还能真的返回returnSize的大小吗? 

经典的错误,标准的零分:传值调用!!

力扣是希望我们在函数内部修改好returnsize的值,这样他才能查看数组的大小以便于访问。

那我们怎么确定这个值大小呢?换句话问,我们如何开辟这个空间呢? 

当然是不建议一次性开一个很大的数组来保证足够使用的。

                   

我们可以模仿顺序表扩容的功能进行realloc,或者直接写一个计数节点个数的函数(此功能在上一篇中有讲)。

                                                                问题出在哪? 

i成为一个局部变量,每次的值都不会改变。

我们任然需要采用传址调用的方法:

int TreeNodeSize(struct TreeNode* root){if(root==NULL){return 0;}return TreeNodeSize(root->left)+TreeNodeSize(root->right)+1;
}void _preorderPut(struct TreeNode* root,int* arr,int* pi){//前序遍历的顺序是根,左子树,右子树if(root==NULL){return;}arr[(*pi)++]=root->val;_preorderPut(root->left,arr,pi);_preorderPut(root->right,arr,pi);}int* preorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize=TreeNodeSize(root);int* arr=(int*)malloc(sizeof(int)*(*returnSize));//只创建一次数组即可,所以真正的遍历还是应当使用子函数int i=0;int* pi=&i;_preorderPut(root,arr,pi);return arr;
}

3.判断是否为子树

572. 另一棵树的子树 - 力扣(LeetCode)

为空、树的比较是最小子问题,isSubtree(left or right)是递归子问题。

我们应该把这两个问题分开,不要将树的比较嵌套进递归中,而应该分隔开两个逻辑。此处树的比较非常类似于前面题目的:

                                                    root1->val==root2->val

只不过是将数值的比较换做了整个子树的比较,我们直接复用之前写好的比较树的函数即可

利用之前的函数:判断树是否相同。遍历主树,将主树的每个值与subroot相比较。

                                                         

一如既往,在二叉树中空一直都是最小子问题,但是此处的空该return false还是return true呢?

根据题目描述,root不可能为空 

满足一次return true就会一直在

                       

每一次函数调用的“isSubtree”语句上做返回,层层返回,直到返回到函数外部

bool isSameTree(struct TreeNode* root, struct TreeNode* subRoot){if(root==NULL && subRoot==NULL){return true;}if(root==NULL || subRoot==NULL){return false;}if(root->val!=subRoot->val){return false;}return isSameTree(root->left,subRoot->left)&&isSameTree(root->right,subRoot->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root==NULL){return false;}if(root->val==subRoot->val&&isSameTree(root,subRoot)){return true;}return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

4.二叉树的创建和销毁(非递归)

二叉树遍历_牛客题霸_牛客网 (nowcoder.com)

这个题完成创建

#include <stdio.h>
#include <stdlib.h>typedef struct BTNode {struct BTNode* left;struct BTNode* right;char val;
}BTNode;BTNode* CreatTree(char* arr, int* pi) {if (arr[*pi] == '#') {(*pi)++;return NULL;}BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->val = arr[(*pi)++];newnode->left = CreatTree(arr, pi);newnode->right = CreatTree(arr, pi);return newnode;
}void Inorder(BTNode* tree, char* arr) {//中序是左子树 根 右子树if (tree == NULL) {return;}Inorder(tree->left, arr);printf("%c ", tree->val);Inorder(tree->right, arr);
}int main() {char arr[100];scanf("%s", arr);int i = 0;BTNode* tree = CreatTree(arr, &i);Inorder(tree, arr);return 0;
}

二叉树的销毁:

前序也能销毁,但是很麻烦,需要变量记录指针。

后序更佳:

后序+队列(利用队列的先进先出)

采取出来一个,带入自己的左右子节点 

注意声明和定义的分离

将树节点指针当作队列节点的值放入队列中。

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

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

相关文章

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解&#xff0c;并且每个知识点基本都会有例子演示&#xff0c;详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前&#xff0c;我们要先知道spring框架在开发时&#xff0c;服务器端采用三层架构的方…

O2OA(翱途)开发平台-快速入门开发一个门户实例

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]拥有门户页面定制与集成的能力&#xff0c;平台通过门户定制&#xff0c;可以根据企业的文化&#xff0c;业务需要设计符合企业需要的统一信息门户&#xff0c;系统首页等UI界面。本篇主要介绍通过门户管理系统如何快速的进行一个…

大数据面试题 —— Kafka

目录 消息队列 / Kafka 的好处消息队列的两种模式什么是 KafkaKafka 优缺点你在哪些场景下会选择 Kafka讲下 Kafka 的整体结构Kafka 工作原理 / 流程Kafka为什么那么快/高效读写的原因 / 实现高吞吐的原理生产者如何提高吞吐量&#xff08;调优&#xff09;kafka 消息数据积压&…

在FMEA风险控制中,首检的重要性!——SunFMEA软件

在制造业中&#xff0c;FMEA被广泛应用于产品设计、生产过程和产品服务的各个阶段。而首检&#xff0c;作为生产过程中的一个重要环节&#xff0c;同样承载着风险控制和质量保障的重任。 今天SunFMEA软件系统从FMEA风险控制的角度来看&#xff0c;首检具有至关重要的地位。首检…

Unity 布局元素Layout Element

Layout Element是一种用于控制UI元素在布局组件&#xff08;如Horizontal Layout Group、Vertical Layout Group、Grid Layout Group、Content Size Fitter和Aspect Ratio Fitter&#xff09;中的大小和位置的组件。Layout Element组件可以附加到UI元素上&#xff0c;以便在布局…

文件操作函数

目录 前言 一、顺序读写函数 1、fgetc 和 fputc 2、fgets 和 fputs 3、fprintf 和 fscanf 4、sscanf 和 sprintf 5、fwrite 和 fread 二、随机读写函数 1、fseek 2、ftell 3、rewind 前言 本章我们学习一下文件操作相关的各种函数 一、顺序读写函数 1、fgetc 和 fpu…

How to convert .py to .ipynb in Ubuntu 22.04

How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook&#xff0c;我也试了一下&#xff0c;感觉还不错&#xff0c;不过&#xff0c;也遇到了一些问题&#xff0c;比方说&#xff0c;我有堆的.py文件&#xff0c;如果要一个一…

软件测试-生命周期、模型

软件测试知识梳理 软件测试软件测试生命周期软件测试模型 软件测试 通过对软件系统进行测试&#xff0c;发现并修复其中潜在的缺陷&#xff0c;确保软件的质量和稳定性。 软件测试生命周期 指软件测试在整个软件开发过程中的各个阶段。 需求分析 在测试周期的初期阶段&…

基于XGBoost和数据预处理的电动汽车车型预测

基于XGBoost和数据预处理的电动汽车车型预测 文章目录 基于XGBoost和数据预处理的电动汽车车型预测1、前言2、导入数据3、各县电动汽车采用情况条形图4、电动车类型饼图5、前5最欢迎的电动车制造商6、XGBoost模型6.1 字符串列的标识6.2 删除不相关的列6.3 编码分类变量6.4 电动…

Python 全栈体系【四阶】(二十)

第五章 深度学习 二、推荐系统 1. 推荐算法介绍 1.1 个性化推荐算法 人口属性 地理属性 资产属性 兴趣属性 1.2 推荐算法分支 协同过滤推荐算法基于内容的推荐算法混合推荐算法流行度推荐算法 1.3 推荐算法 为推荐系统选择正确的推荐算法是非常重要的决定。目前为止…

两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合

区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕

【机器学习之---数学】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

6、ChatGLM3-6B 部署实践

一、ChatGLM3-6B介绍与快速入门 ChatGLM3 是智谱AI和清华大学 KEG 实验室在2023年10月27日联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型&#xff0c;免费下载&#xff0c;免费的商业化使用。 该模型在保留了前两代模型对话流畅、部署门槛低等众多…

Python爬虫:爬虫基本概念、流程及https协议

本文目录&#xff1a; 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

基于springboot+vue调用百度ai实现车牌号识别功能

百度车牌号识别官方文档 结果视频演示 后端代码 private String getCarNumber(String imagePath, int count) {// 请求urlString url "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";try {byte[] imgData FileUtil.readFileByBytes(imagePath);Stri…

【Python进阶】探秘装饰器:揭开简洁与强大的神秘面纱

引言 在Python的世界里&#xff0c;有一种魔法般的高级特性——装饰器&#xff08;Decorators&#xff09;&#xff0c;它就像一块块功能各异的积木&#xff0c;能够让我们的代码变得更加灵活、优雅且易于维护。今天&#xff0c;让我们一同走进装饰器的殿堂&#xff0c;探索其…

R语言随机抽取数据,并作两组数据间t检验,并保存抽取的数据,并绘制boxplot

前提&#xff1a;接着上述R脚本输出的seed结果来选择应该使用哪个seed比较合理&#xff0c;上个R脚本名字&#xff1a; “5utr_计算ABD中Ge1和Lt1的个数和均值以及按照TE个数小的进行随机100次抽样.R” 1.输入数据&#xff1a;“5utr-5d做ABD中有RG4和没有RG4的TE之间的T检验.c…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现五

【简单介绍】 依托先进的目标检测算法YOLOv8与灵活的PyQt5界面开发框架&#xff0c;我们倾力打造出了一款集直观、易用与功能强大于一体的目标检测GUI界面软件。通过深度融合YOLOv8在目标识别领域的出色性能与PyQt5的精美界面设计&#xff0c;我们成功推出了一款高效且稳定的软…

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)

目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …

软件接口安全设计规范及审计要点

1.token授权安全设计 2.https传输加密 3.接口调用安全设计 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计 项目管理全套资料获取&#xff1a;软件开发全套资料_数字中台建设指南-CSDN博客