二叉树—leetcode

前言

本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目

请看完上一篇:数据结构-二叉树-CSDN博客

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

图解:

题目及其代码

题目一

​编辑

题目二

​编辑

题目三

​编辑

题目四

题目五

​编辑

题目六


图解:

题目及其代码

题目一

965. 单值二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/univalued-binary-tree/description/

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

输入:[2,2,2,5,2]
输出:false

提示:

  1. 给定树的节点数范围是 [1, 100]
  2. 每个节点的值都是整数,范围为 [0, 99] 。
// 函数声明:检查给定的二叉树根节点是否代表一个单值树
bool isUnivalTree(struct TreeNode* root) {// 如果根节点为空,也认为它是单值树(空树可以视为所有节点值都相同的情况)if (root == NULL)return true;// 检查左子树:如果存在左子节点,并且其值不等于根节点的值,则返回falseif (root->left && root->left->val != root->val)return false;// 检查右子树:如果存在右子节点,并且其值不等于根节点的值,则返回falseif (root->right && root->right->val != root->val)return false;// 递归检查左子树和右子树是否也都是单值树// 只有当左右子树都是单值树,并且它们的值与当前根节点的值相同时,整个树才是单值树return isUnivalTree(root->left) && isUnivalTree(root->right);
}

题目二

100. 相同的树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/same-tree/description/

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断是否都为NULL,注意:两个为NULL也算相等if (p == NULL && q == NULL)return true;//判断一个为NULL,一个不为NULLif(p == NULL || q == NULL )return false;//判断接节点的值是否相等,这边主要判断不相等,这样可以排除更多可能if(p->val != q->val)return false;//返回如果都为真就相等,如果有一个为假就不相等return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

题目三

101. 对称二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/description/

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//判断是否都为NULL,注意:两个为NULL也算相等if (p == NULL && q == NULL)return true;//判断一个为NULL,一个不为NULLif(p == NULL || q == NULL )return false;//判断接节点的值是否相等,这边主要判断不相等,这样可以排除更多可能if(p->val != q->val)return false;//返回如果都为真就相等,如果有一个为假就不相等return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
}

题目四

144. 二叉树的前序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

94. 二叉树的中序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-inorder-traversal/description/

145. 二叉树的后序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

这个三个OJ写法差不多只需要改变一点就能实现

// 前序遍历二叉树的辅助函数
// 参数:
// - root: 当前正在访问的二叉树节点指针
// - arr: 用于存储遍历结果的整型数组
// - i: 指向当前数组索引的指针,用于在遍历时追踪下一个存储位置
void Tree_preorder(struct TreeNode* root, int* arr, int* i){// 如果当前节点为空,则直接返回,结束当前递归路径if(root == NULL)return;// 将当前节点的值存入数组,并递增索引i(使用指针解引用后加法,避免了直接传值的问题)arr[(*i)++] = root->val;// 递归遍历左子树Tree_preorder(root->left, arr, i);// 递归遍历右子树Tree_preorder(root->right, arr, i);
}// 计算二叉树的节点总数
// 参数:
// - root: 二叉树的根节点指针
// 返回值:
// - 树的节点总数,空树返回0
int Treesize(struct TreeNode* root){// 递归终止条件:如果树为空,返回0return root == NULL ? 0 : // 否则,节点总数等于左子树节点数 + 右子树节点数 + 1(根节点)Treesize(root->left) + Treesize(root->right) + 1;
}// 主要函数:执行二叉树的前序遍历并返回结果数组
// 参数:
// - root: 二叉树的根节点指针
// - returnSize: 输出参数,返回数组的实际元素数量
// 返回值:
// - 存储前序遍历结果的数组指针
int* preorderTraversal(struct TreeNode* root, int* returnSize) {// 首先,计算二叉树的总节点数,用于动态数组的分配*returnSize = Treesize(root); // 通过树的节点个数,确定数组大小// 根据节点总数动态分配内存给数组arrint *arr = (int*)malloc(sizeof(int)*(*returnSize));// 初始化索引变量i为0,用于记录数组中的当前位置int i = 0;// 调用前序遍历的辅助函数填充数组Tree_preorder(root, arr, &i);// 完成遍历后,返回存储了前序遍历结果的数组return arr;
}

 

题目五

572. 另一棵树的子树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/subtree-of-another-tree/

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
// 函数:判断两棵二叉树是否相同
// 参数:p 和 q 分别表示两棵树的根节点
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 如果两棵树的当前节点都为NULL,说明已遍历完且两者结构相同,返回trueif (p == NULL && q == NULL)return true;// 如果只有一个节点为NULL,说明两棵树结构不同,返回falseif (p == NULL || q == NULL)return false;// 检查当前节点的值是否相等,如果不等则两棵树不相同,返回falseif (p->val != q->val)return false;// 递归检查左右子树是否也相同,只有都相同才返回truereturn isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}// 函数:判断一棵树中是否存在和另一棵树相同的子树
// 参数:root 是大树的根节点,subRoot 是要查找的子树的根节点
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {// 如果大树的当前节点为空,说明没有找到子树,返回falseif (root == NULL) {return false;}// 如果大树的当前节点与子树的根节点值相等,// 进一步检查以当前节点为根的子树是否与subRoot相同if (root->val == subRoot->val &&  isSameTree(root, subRoot)) {// 如果相同,返回truereturn true;}// 在当前节点的左子树和右子树中递归查找子树subRoot// 使用逻辑或操作,只要一边存在匹配即返回truereturn isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

题目六

二叉树遍历_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1

输入:

abc##de#g##f###

输出:

c b e g d f a 

#include <stdio.h>
#include <stdlib.h>// 更改基本数据类型名称为DataType以增强代码可读性
typedef char DataType;// 定义二叉树节点结构体,包含节点值(data)及左右子节点指针
typedef struct TreeNode {DataType data; // 节点存储的数据,原代码中的val改为data以增强理解struct TreeNode* left; // 左子节点指针struct TreeNode* right; // 右子节点指针
} TreeNode;// 创建二叉树的函数,接收字符串表示的树结构和当前字符索引指针
// 字符串中'#'表示空节点,其他字符表示节点值
TreeNode* CreateTree(char* p, int* pi) {// 当遇到 '#',表示当前节点为空,索引加一后返回NULLif (p[*pi] == '#') {(*pi)++;return NULL;}// 动态分配新节点内存,检查是否分配成功TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));if (!root) { // 内存分配失败处理fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE); // 程序退出}// 初始化节点值,并递增索引指向下一个字符root->data = p[(*pi)++];// 递归创建左子树和右子树root->left = CreateTree(p, pi);root->right = CreateTree(p, pi);return root; // 返回当前创建的节点
}// 中序遍历二叉树的函数,按照“左-根-右”的顺序访问每个节点
void InOrder(TreeNode* root) {if (root == NULL) return; // 遇到空节点直接返回,结束递归InOrder(root->left);    // 先遍历左子树printf("%c ", root->data); // 打印当前节点值InOrder(root->right);   // 最后遍历右子树
}int main() {char arr[100]; // 用于存储输入的二叉树字符串表示int i = 0;     // 索引变量,用于追踪字符串中的当前字符位置// 从用户输入中读取二叉树的字符串表示scanf("%s", arr);// 根据输入字符串创建二叉树TreeNode* root = CreateTree(arr, &i);// 对创建的二叉树进行中序遍历并打印节点值InOrder(root);return 0; // 程序正常结束
}

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

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

相关文章

Llama模型家族之Stanford NLP ReFT源代码探索 (四)Pyvene论文学习

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…

Java数据结构准备工作---常用类

文章目录 前言1.包装类1.1.包装类基本知识1.2.包装类的用途1.3.装箱和拆箱1.3.1.装箱&#xff1a;1.3.2.拆箱 1.4 包装类的缓存问题 2.时间处理类2.1.Date 时间类(java.util.Date)2.2.DateFormat 类和 SimpleDateFormat 类2.3.Calendar 日历类 3.其他常用类3.1.Math类3.2.Rando…

Diffusers代码学习: T2I Adapter

T2I Adapter是一款轻量级适配器&#xff0c;用于控制文本到图像模型并为其提供更准确的结构指导。它通过学习文本到图像模型的内部知识与外部控制信号&#xff08;如边缘检测或深度估计&#xff09;之间的对齐来工作。 T2I Adapter的设计很简单&#xff0c;条件被传递到四个特征…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

KEIL5如何打开KEIL4的GD工程

GD官方提供的很多KEIL例程为KIEL4的版本&#xff0c;读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题&#xff0c;具体表现如下图所示。 我们该怎么办呢&#xff1f; 下面为大家介绍两种方法&#xff1a; 第一种方法是在keil4的工程后缀u…

基于不确定性的相互学习 用于联合医学图像分类和分割

文章目录 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation摘要方法实验结果 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation 摘要 该论文提出了一种基于不确定性的相互学习…

eNSP学习——RIP故障处理

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、导入设备预配置 2、排除R1与R2间的故障 3、排除R1与R3间的故障 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PDF版_ensp配置命令大全资源-CSDN文库 主要命令 //检查…

SpringBoot集成缓存功能

1. 缓存规范 Java Caching定义了五个核心接口&#xff0c;分别是&#xff1a;CachingProvider、CacheManager、Cache、Entry和Expiry。 CachingProvider&#xff1a;定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。CacheM…

分治乘法详细讲解

我绝对不会告诉你我是因为太蒻了&#xff0c;不会 FFT 才搞这个的。 我用一下别人的图没什么问题吧 看得懂吧&#xff1f;比如 X 123456 , Y 987654 X123456,Y987654 X123456,Y987654&#xff0c;则 n 3 , A 123 , B 456 , C 987 , D 654 n3,A123,B456,C987,D654 n3…

Web学习_SQL注入_联合查询注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c; UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名&#xff0c;并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符&#xff0c;将攻击者希望查询的语句…

jmeter性能优化之mysql监控sql慢查询语句分析

接上次博客&#xff1a;基础配置 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、练习jmeter脚本检测mysql慢查询 随意找一个脚本(多用户登录并退出)&#xff0c;并发数设置300、500后分别查看mysql监控平台 启动后查看&#xff0c;主要查看mysql…

406. 根据身高重建队列(中等)

406. 根据身高重建队列 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;406. 根据身高重建队列 2.详细题解 做一道题之前先静心&#xff0c;默念三遍一切反动派都是纸老虎。已知一个队列&#xff0c;队列中每个数据表示一个属性&#xf…

【qt】启动窗口的玩法

启动窗口的玩法 一.应用场景二.界面类设计窗口三.main中创建四.窗口显示标识五.功能实现1.读取注册表2.md5加密3.登录实现4.保存注册表5.功能演示 六.鼠标事件拖动窗口1.找到鼠标事件的函数2.点击事件3.移动事件4.释放事件 七.总结 一.应用场景 一般我们的软件和应用都会一个登…

实战项目《负载均衡在线OJ系统》

一、项目灵感来源 在日常做题的过程中&#xff0c;我们总会去力扣和牛客网上去做题&#xff0c;但是从来没有想过网站是如何加载给用户的&#xff0c;以及在提交代码时&#xff0c;是如何得知我们的代码是否正确。基于这样的原因&#xff0c;也是学习到一定程度的知识后&#x…

python中的循环语句

while循环 基本语法格式 while 条件&#xff1a; 循环体 条件为真&#xff0c;则执行循环体代码 条件为假&#xff0c;则结束循环 打印 1-10的整数 死循环有时候也是必须的&#xff0c; while语句的语法&#xff1a; &#xff08;1&#xff09;变量的初始化&#xff0c;…

你知道又美又飒的英歌队头槌女孩吗?无标题

今天是文化和自然遗产日&#xff0c;本“ 人民体验官 ”推广人民日报官方微博文化产品《 16岁英歌队头槌女孩又美又飒》。 截图&#xff1a;来源“ 人民体验官 ”推广平台 郑梓欣是汕头潮阳西门女子英歌队的“头槌”。在2024年春节英歌舞展演巡游活动中&#xff0c;汕头潮阳西…

MySQL第二种实现方式:现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果

接上篇&#xff1a;链接: 现在有一个生产计划&#xff0c;甲乙丙3个品类共16个产品&#xff0c;生产时间6天&#xff0c;每天甲品类可以生产1张单&#xff0c;乙3张&#xff0c;丙1张&#xff0c;请用MySQL写出H列的效果 第二种写法&#xff1a; -- 使用WITH子句创建CTE WITH…

Spark参数配置不合理的情况

1.1 内存设置 &#x1f4be; 常见的内存设置有两类&#xff1a;堆内和堆外 &#x1f4a1; 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g&#xff0c;造成资源浪费 &#x1f4c9;。 通常 executor 堆外内存在 executor.cores1 的时候&#xff0c;1g 足够了&…

UltraEditUEStudio软件最新版下载及详细安装教程

UEStudio简介&#xff1a; UEStudio建立在上文本编辑器UltraEdit的功能基础上&#xff0c;并为团队和开发人员提供了其他功能&#xff0c;例如深度Git集成。您可以直接在UEStudio中克隆&#xff0c;签出&#xff0c;更新&#xff0c;提交&#xff0c;推入/拉入等操作&#xff…