【二叉树】OJ题目


 🌟个人主页:落叶


目录

单值⼆叉树

【单值二叉树】代码

相同的树

【相同二叉树】代码

对称⼆叉树

【对称二叉树】代码

另一颗树的子树

【另一颗树的子树】代码

二叉树的前序遍历

【二叉树前序遍历】代码

二叉树的中序遍历

【二叉树中序遍历】代码

二叉树的后序遍历

【二叉树的后序遍历】代码

⼆叉树的构建及遍历

【⼆叉树的构建及遍历】代码


单值⼆叉树

单值⼆叉树就是每个节点的数值都是一样的

链接:单值二叉树


思路:把当前节点的左子树的数值,和当前节点数值进行比较,不一样的话就不是单值⼆叉树,返回false。

右子树也是一样的,把当前节点的右子树的数值,和当前节点数值进行比较,不一样的话就不是单值⼆叉树,返回false。




判断,当递归到空的时候返回true

判断左子树节点是不是空&&判断,左子树的数值和当前节点的数值,不等于返回false。 

再判断右子树节点是不是空&&判断,右子树的数值和当前节点的数值,不等于返回false。

递归下去,左右子树都和当前节点进行比较,不一样返回false。


【单值二叉树】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/typedef struct TreeNode BT;
bool isUnivalTree(struct TreeNode* root) {//是空直接返回trueif(root == NULL){return true;}//判断左子树和当前节点的值,不一样就不是单值⼆叉树返回falseif(root->left != NULL && root->left->val != root->val){return false;}//判断右子树和当前节点的值,不一样就不是单值⼆叉树返回falseif(root->right != NULL && root->right->val != root->val){return false;}//递归下去,判断是不是truereturn isUnivalTree(root->left) && isUnivalTree(root->right);}

相同的树

两个一模一样的二叉树


链接:相同的树


思路:判断有一个节点为NULL或数值不一样,返回false。递归左子树和右子树。



判断当两边节点为空,返回true。

判断只有一个节点为空的话,不是相同二叉树吗,返回false。

判断数值,不一样的话不是相同二叉树,返回false。

递归两边的左子数 && 右子树


【相同二叉树】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/typedef struct TreeNode BT;
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断节点为空,返回trueif(p==NULL && q==NULL){return true;}//只有一个节点为空,,不是相同二叉树,返回falseif(p==NULL|| q==NULL){return false;}//比较数值,不一样就不是相同二叉树,返回falseif(p->val != q->val){return false;}//递归,下去判断p和q的左子树和右子树return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

对称⼆叉树


链接:对称二叉树


思路:我们可以用【相同的树】思路,把根节点的左子树和右子树进行比较。

左边2节点的左子树和右边2节点的右子树进行比较,




传根节点的左子树和右子树。

递归的时候左边左子树,和右的右子树比较

左边的右子树,和右边的左子树比较。


【对称二叉树】代码



另一颗树的子树

root 和 subRoot是同一颗树调用相同的树,直接返回。

不一样的话,root 的子树和subRoot进行比较。


链接:对称二叉树


思路:先判断root节点为空的话返回false,然后再判断ROOT节点和subRoot是不是相同,相同返回true,递归左子树找相同的树,再找右子树。



判断root节点为空返回false。

调用相同的树函数,判断root节点下面是不是和subRoot一样,一样返回true。

递归root的左子树判断是不是和subRoot相同,再递归右子树。


【另一颗树的子树】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
//找相同树
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断节点为空,返回trueif(p==NULL && q==NULL){return true;}//只有一个节点为空,,不是相同二叉树,返回falseif(p==NULL|| q==NULL){return false;}//比较数值,不一样就不是相同二叉树,返回falseif(p->val != q->val){return false;}//递归,下去判断p和q的左子树和右子树return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){//root节点为空返回falseif(root == NULL){return false;}//判断root节点下面的节点,和subRoot是不是相同,相同返回trueif(isSameTree(root,subRoot)){return true;}//递归,遇到相同的另一颗子树返回true,两边都遇到NULL了就说明不相同return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

二叉树的前序遍历


链接:二叉树前序遍历


思路:求出二叉树节点个数,然后申请arr数组空间,空间大小为二叉树节点个数,然后前序遍历,递归遇到NULL就返回,不是NULL往数组存放数值,然后继续往下递归。


第一步:求出二叉树的节点个数,根+左子树节点个数+右子树节点个数。

第二步:动态申请,arr数组空间,空间大小是二叉树节点个数。

第三步:前序遍历,如果左子树为NULL,那么左子树一个节点都没有了,不为NULL,把节点数值存放到arr数组,然后递归。

最后返回arr数组。


【二叉树前序遍历】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/typedef struct TreeNode TreeNode;
//求出二叉树节点个数
int size(TreeNode* root)
{if(root == NULL){return 0;}//二叉树个数是:根+左子数节点个数+右子数节点个数return 1 + size(root->left) + size(root->right);
}
//前序遍历
void bian(TreeNode* root,int* arr,int *i)
{if(root==NULL){return;}//根-左-右arr[(*i)++] = root->val;bian(root->left,arr,i);bian(root->right,arr,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {//求出二叉树节点个数*returnSize = size(root);//动态申请--arr数组空间大小int* arr = (int*)malloc(sizeof(int)*(*returnSize));int i=0;//前序遍历bian(root,arr,&i);//返回return arr;
}

二叉树的中序遍历


链接:二叉树的中序遍历


第一步:求出二叉树的节点个数,根+左子树节点个数+右子树节点个数。

第二步:动态申请,arr数组空间,空间大小是二叉树节点个数。

第三步:中序遍历,如果左子树为NULL,那么左子树一个节点都没有了,不为NULL,把节点数值存放到arr数组,然后递归。

最后返回arr数组。



【二叉树中序遍历】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
typedef struct TreeNode SL;
//求出二叉树节点个数
int size(SL* root)
{if(root == NULL){return 0;}//二叉树个数是:根+左子数节点个数+右子数节点个数return 1 + size(root->left) + size(root->right);
}
//中序遍历
void zho(SL* root ,int* arr,int* i)
{if(root == NULL){return ;}//中序遍历:左-根-右zho(root->left,arr,i);arr[(*i)++] = root->val;zho(root->right,arr,i); 
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {//求出二叉树节点个数*returnSize = size(root);//动态申请--arr数组空间大小int* arr = (int*)malloc(sizeof(int) * (*returnSize));//中序遍历int i = 0;zho(root,arr,&i);//返回return arr;
}

二叉树的后序遍历


链接:二叉树的后序遍历


第一步:求出二叉树的节点个数,根+左子树节点个数+右子树节点个数。

第二步:动态申请,arr数组空间,空间大小是二叉树节点个数。

第三步:中序遍历,如果左子树为NULL,那么左子树一个节点都没有了,不为NULL,把节点数值存放到arr数组,然后递归。

最后返回arr数组。



【二叉树的后序遍历】代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/typedef struct TreeNode SL;//求出二叉树节点个数
int size(SL* root)
{if(root==   NULL){return 0;}//二叉树个数是:根+左子数节点个数+右子数节点个数return 1 + size(root->left) + size(root->right);
}
//后序遍历
void ho(SL*root,int*arr,int* i)
{if(root==NULL){return;}//后序遍历= 左-右-根ho(root->left,arr,i);ho(root->right,arr,i);arr[(*i)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {//求出二叉树节点个数*returnSize = size(root);//动态申请--arr数组空间大小int* arr = (int*)malloc(sizeof(int) * (*returnSize));//后序遍历int i = 0;ho(root,arr,&i);//返回arrreturn arr;
}

⼆叉树的构建及遍历


链接:⼆叉树的构建及遍历


思路:需要输入长度不超过100的字符,然后再通过(前序遍历)二叉树,然后输出二叉树中序遍历结果。



创建二叉树节点结构体,输入长度不超过100的字符串。

第一步:根据字符串(前序遍历)创建二叉树,传数组,和下标过去,

if判断如果arr数组下标为*i 的 字符 == # ,返回NULL,i++往后走。

创建二叉树节点给ROOT,传arr数组下标为*i 的 字符 ,申请空间,把传过来的值给tab->arr,

再把tab的左子树和右子树置为NULL。

(*i)++往后走,递归创建左子树,递归创建右子树,返回ROOT节点 ,最后一次返回的就是根节点了。

创建完二叉树,返回根节点后,进行输出,二叉树中序遍历结果,传二叉树根节点,

进行中序遍历(左-根-右)。


【⼆叉树的构建及遍历】代码

#include <stdio.h>
#include <unistd.h>
//二叉树节点结构体
typedef struct kko
{char arr;//存放字符struct kko* zuo;//左子树struct kko* you;//右子树
}SL;//创建二叉树节点
SL* cj_jied(char x)
{//申请节点空间SL* tab = (SL*)malloc(sizeof(SL));tab->arr = x;tab->you = tab->zuo = NULL;return tab;}//前序遍历
SL* qian(char* arr,int* i)
{if(arr[*i] == '#'){(*i)++;return NULL;}//创建二叉树节点给ROOTSL* root = cj_jied(arr[*i]);(*i)++;root->zuo = qian(arr , i);//递归创建左子树root->you = qian(arr ,i);//递归创建右子树return root;
}
//中序遍历
void zho(SL* root)
{if(root == NULL){return;}//中序遍历——根——左——右zho(root->zuo);//递归遍历左子树printf("%c ",root->arr);zho(root->you);//递归遍历右子树
}int main() {char add[100];scanf("%s", add);//根据字符串(前序遍历)创建二叉树int i = 0;SL* root = qian(add,&i);//输出二叉树中序遍历结果zho(root);return 0;
}

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

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

相关文章

NVIDIA将在Hot Chips 2024会议上展示Blackwell服务器装置

NVIDIA 将在 Hot Chips 2024 上展示其 Blackwell 技术堆栈&#xff0c;并在本周末和下周的主要活动中进行会前演示。对于 NVIDIA 发烧友来说&#xff0c;这是一个激动人心的时刻&#xff0c;他们将深入了解NVIDIA的一些最新技术。然而&#xff0c;Blackwell GPU 的潜在延迟可能…

【freeDiameter】服务端和客户端的连接流程

连接流程详解 进程启动时&#xff0c;先使用main_cmdline解析命令行参数&#xff0c;比如使用-c就会使用指定路径的配置文件&#xff0c;使用-d就会启用后台进程。 之后使用fd_core_initialize初始化核心库。具体会先使用fd_conf_init初始化配置&#xff0c;比如设置各项的默…

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数&#xff0c;它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点&#xff08;OccluderNode&#xff09;&#xff0c;…

缺失ffmpeg.dll要用什么修复方法?快速恢复丢失的ffmpeg.dll文件

多媒体软件用户常常会遭遇一个提示&#xff1a;系统无法找到ffmpeg.dll文件。这类情况经常在启动视频编辑软件、流媒体播放应用或其他音视频处理工具时出现&#xff0c;导致相关程序无法正确加载和执行。ffmpeg.dll是一种关键的动态链接库文件&#xff0c;负责处理复杂的视频和…

ssrf+redis未授权访问漏洞复现

ssrfredis未授权访问漏洞复现 一&#xff0c;pikachu靶场练习 docker拉取环境&#xff1a; docker run -d -p 8765:80 8023/pikachu-expect:latest国内很多加速源都用不成&#xff0c;配置代理拉取即可&#xff0c;配置方式如下&#xff1a; 1&#xff0c;新建目录 mkdir -…

数据结构与算法的代码实现(C++版)

数据结构与算法的代码实现&#xff08;C版&#xff09; 1. 线性表的顺序表示和实现1.1 线性表的初始化1.2 线性表的销毁1.3 线性表的清空1.4 线性表的长度1.5 判断线性表是否为空1.6 线性表的线性表取值1.7 线性表的顺序查找1.8 线性表的插入1.9 线性表的删除总结 2. 线性表的链…

JavaScript ES6+ 新特性

JavaScript ES6 新特性 引言 随着前端技术的不断发展&#xff0c;JavaScript 语言也在不断演进。自 ES6&#xff08;ES2015&#xff09;发布以来&#xff0c;JavaScript 引入了许多新的特性和语法&#xff0c;极大地提升了开发者的编程体验和代码的可维护性。本篇文章将详细探…

真话有危险,测评需谨慎!一个家最大的内耗:谁都在抱怨,没人肯改变——早读(逆天打工人爬取热门微信文章解读)

现在都这么完了吗&#xff1f; 引言Python 代码第一篇 洞见 一个家最大的内耗&#xff1a;谁都在抱怨&#xff0c;没人肯改变第二篇 故事风云录结尾 引言 慢慢调整时间 一是现在有点忙 做那个传播声音的研究实验实在是有点没有头绪 没有头绪的事情你就不知道怎么安排时间 也就…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

HarmonyOs如何获取rawfile目录下的所有文件列表

最近在做一个功能&#xff0c;需要使用获取rawfile下目录的所有文件 参考连接为&#xff1a; zRawfile-模块-C API-Localization Kit&#xff08;本地化开发服务&#xff09;-应用框架 - 华为HarmonyOS开发者 (huawei.com) 需要使用到native实现&#xff0c;实现步骤&#…

2008-2020年 中国健康与养老追踪调查CHARLS数据合集

中国健康与养老追踪调查&#xff08;China Health and Retirement Longitudinal Study, CHARLS&#xff09;是一项由北京大学国家发展研究院主持的大型跨学科调查项目。该项目始于2011年&#xff0c;每两到三年对样本进行一次追踪调查&#xff0c;旨在收集代表中国45岁及以上中…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

关于告警,要想做好,从这些方面着手

各类监控系统都会产生告警事件&#xff0c;于是&#xff0c;就产生了 FlashDuty、PagerDuty、Opsgenie 这类产品&#xff0c;做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力&#xff0c;参考&#xff08;chao xi&#xff09;这些产品的功能就可…

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南&#xff0c;介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

35岁程序员的4条出路!请提早布局!

小编准备入门了Python入门学习籽料80个Python爬虫实战入门实例 点击 领取&#xff08;无偿获得&#xff09; 20多岁&#xff0c;初入职场&#xff0c;满腔热血&#xff0c;对未来充满憧憬&#xff1b; 30多岁&#xff0c;家庭事业双重压力&#xff0c;开始迷茫&#xff0c;对…

阿里云发送短信功能(Java)

&#xff08;1&#xff09;注册用户&#xff0c;并且开通短信套餐 &#xff08;2&#xff09; 点击快速学习&#xff0c;然后绑定测试的手机号码。 选用专用测试签名&#xff08;自定义的话阿里可能会验证什么什么的比较麻烦&#xff09; 然后在选取调用API &#xff08;3&…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的&#xff1f; 就在刚刚它又全面升级了 新版无需安装&#xff0c;直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Git实战精粹

一、快速入门 1. 什么是Git Git是一个分布式的版本控制软件。 软件&#xff0c;类似于QQ、office、dota等安装到电脑上才能使用的工具版本控制&#xff0c;类似于毕业论文、写文案、视频剪辑等&#xff0c;需要反复修改和保留原历史数据分布式 文件夹拷贝本地版本控制集中式…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1&#xff1a;介绍 1.1&#xff1a;什么是protobuf 是一种数据格式&#xff0c;同json&#xff0c;xml&#xff0c;等。但是一种二进制数据格式。 1.2&#xff1a;强在哪里&#xff1f;为啥要用&#xff1f; 小&#xff0c…