【二叉树】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.rhkb.cn/news/411238.html

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

相关文章

【大模型】llama系列模型基础

前言&#xff1a;llama基于transformer架构&#xff0c;与GPT相似&#xff0c;只用了transformer的解码器部分。本文主要是关于llama&#xff0c;llama2和llama3的结构解读。 目录 1. llama1.1 整体结构1.2 RoPE1.3 SwiGLU 激活函数 2. llama22.2 GQA架构2.3 RLHF3. llama3 参考…

CAD中命令和系统变量

屏幕去除菜单全屏显示&#xff1a; ThisDrawing.SendCommand ("CLEANSCREENON ") 恢复原始&#xff1a;ThisDrawing.SendCommand ("CLEANSCREENOFF ") CAD中系统变量决定图形的基本设置。 第一个系统变量&#xff1a;uscicon vba代码如下&#xff1a; …

【Linux】——Rocky Linux配置静态IP

Rocky Linux配置静态IP Rocky Linux Rocky Linux 进入官网进行下载&#xff0c;下载版本自定义 官网link 获取ip地址 ip addr 获取服务器ip地址 进入网络配置文件目录&#xff1a; cd /etc/NetworkManager/system-connections/vi打开ens33.nmconnection 在IPv4下输入配置信…

Ubuntu美化为类Windows风格

博主的系统为 Ubuntu22.04 参考文献&#xff1a;How to Make Ubuntu Look Like Windows 11 | 22.04 GNOME 43 / 42 | Linux AF Tech 可能遇到的bug的解决方法&#xff1a;如何在 Linux 中安装和更改 GNOME 主题 先来一下视频演示&#xff1a; 下面正式开始安装。在主文件夹下打…

DWF 支持的 TON 链 Telegram 免费宠物游戏 Gatto_game,推出 “Paws Up! 世界锦标赛”

TON 链在这轮牛市里无疑是一匹脱缰的黑马&#xff0c;创造了一个又一个爆款&#xff0c;为持有者带来了不菲的收益。 Gatto_game 是一款 TON链 Tamagotchi 电子宠物风格的 P2E web3 游戏。可以通过喂养升级&#xff0c;参加比赛赚取 $TON 或者 $GTON &#xff0c;或许就是下一个…

python解释器[源代码层面]

1 PyDictObject 在c中STL中的map是基于 RB-tree平衡二元树实现&#xff0c;搜索的时间复杂度为O(log2n) Python中PyDictObject是基于散列表(散列函数)实现&#xff0c;搜索时间最优为O(1) 1.1 散列列表 问题&#xff1a;散列冲突&#xff1a;多个元素计算得到相同的哈希值 …

软件设计原则之依赖倒置原则

依赖倒置原则&#xff08;Dependency Inversion Principle, DIP&#xff09;是软件设计中一个非常重要的原则&#xff0c;它属于面向对象设计的SOLID原则之一。这个原则的核心在于通过抽象来降低模块间的耦合度&#xff0c;使得系统更加灵活和可维护。 目录 依赖倒置原则的基本…

「软件测试」最全面试问题和回答,全文背熟不拿下offer算我输

3.公司这边测试人员分配比例 4.进入公司&#xff0c;我这边大概的工作安排 5&#xff0c;公司这么后续发展机会还有培养 6&#xff0c;有没有培训 7&#xff0c;面试没有回答上的问题&#xff0c;再去请教 2.5 你的职业发展规划和职业目标 根据公司况&#xff0c;个人原因…

【Spring Boot 3】自定义拦截器

【Spring Boot 3】自定义拦截器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

机器学习 之 DBSCAN算法 及实现

1.K-means 与 DBSCAN 的比较 K-means 和 DBSCAN 都是聚类算法&#xff0c;但它们之间有显著的区别&#xff1a; K-means&#xff1a; 基于中心点的方法&#xff0c;要求用户提前指定簇的数量。适用于球形簇&#xff0c;且簇大小相近。无法处理噪声数据和任意形状的簇。 DBSCAN…

SQLi-LABS靶场36-40通过攻略

less-36 这一关是转义函数换成了mysql_real_escape_string,绕过方法与35关一致 1.判断注入点 2.判断闭合方式 id1A0 -- 3.查看页面回显点 ?id-1%A0%27%20%20union%20select%201,2,3-- 4.查询数据库名 ?id-1%A0%27%20%20union%20select%201,database(),3-- 5.查询数据库的…

音视频封装格式之FLV

FLV&#xff08;Flash Video&#xff09;是一种常见的视频文件格式&#xff0c;FLV 格式最初是由 Adobe 公司开发的&#xff0c;旨在为网络视频提供一种高效、可扩展且易于流式传输的解决方案。随着在线视频的迅速发展&#xff0c;FLV 因其良好的兼容性和流式传输性能&#xff…

喜羊羊做Python二级(模拟考试--易错点)

今天距离Python二级考试&#xff0c;还有28天左右。坚持每天做几套试卷&#xff0c;保持记忆和手感。 个人在做题的过程中是先不断练习选择题。当你选择题不达标的时候&#xff0c;系统不会看大题&#xff08;大概是觉得选择题都做的那么差&#xff0c;大题也不会那么好&#…

mac 虚拟机PD19运行E-prime实验遇到E-prime unable to set display mode:0*80004001问题解决

作者&#xff1a;50% unable to set display mode问题 总结&#xff1a; 1. 修改该Experiment的Devices中的Dispaly为640*680&#xff0c;Color Bit Depth设置为32。&#xff08;这个分辨率仅限于学习用&#xff0c;实际实验应该还是在真机上&#xff09; 2. 右键开始菜单中的E…

hadoop生态圈(四)- MapReduce

目录 MapReduce的基本原理 MapReduce流程图 Map阶段执行流程 Reduce阶段执行流程 Shuffle机制 MapReduce解决的是海量数据计算 MapReduce的思想核心是“分而治之”。就是把一个复杂的问题按一定的“分解”方法分为规模较小的若干部分&#xff0c;然后逐个解决&#xff0c;…

Meta AI动画生成功能的规模化部署与优化策略

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

基于ROM的VGA显示

前言 在早期计算机和嵌入式系统中&#xff0c;图形显示和用户界面的实现主要依赖于硬件技术。VGA&#xff08;视频图形阵列&#xff09;标准在1980年代中期成为主流图形显示技术&#xff0c;其高分辨率和良好的兼容性使其在计算机显示领域中占据了重要地位。VGA标准支持640x480…

如何在Java中使用protobuf

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

聚类:k-Means 和 k-Medoid

1. 前言 在《对静态分析缺陷报告进行聚类&#xff0c;以降低维护成本》 提到使用 k-Medoid 通过相似缺陷的聚类&#xff0c;来减少程序员对大量缺陷分析的工作量。 k-Medoid 和传统的 k-Means 聚类算法有什么差别呢&#xff1f; 简单的说&#xff0c;K-Medoid 算法是一种基于…