【数据结构初阶】二叉树OJ题

news/2024/5/3 6:20:56/文章来源:https://blog.csdn.net/m0_70088010/article/details/129896256

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:数据结构初阶
⭐代码仓库:Data Structure
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

二叉树OJ题

  • 一、单值二叉树
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 二、相同的树
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 三、对称二叉树
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 四、二叉树的前序遍历
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 五、二叉树的中序遍历&后序遍历
    • 1、题目描述
    • 2、代码
  • 六、另一棵树的子树
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 七、二叉树遍历
    • 1、题目描述
    • 2、思路及演示
    • 3、代码
  • 总结


一、单值二叉树

1、题目描述

力扣题目来源
在这里插入图片描述

2、思路及演示

简单讲讲就是整个树的所有结点的数据都相等即可,需要的是遍历或者递归每个结点进行比较,直到每个结点的值都想等即可,但我们写代码的时候注意遍历一定要是控制返回false的条件,只要是是true的状态就可以继续往后走。遍历结束的条件是到NULL的时候。我们每次进行遍历的时候是先判断左右子树是否存在以及左右子树的值是否跟根节点相同,如果相同则继续遍历,不相同则直接返回false,直到遍历完,遍历完是需要进行递归遍历,是前序遍历的思想,先根再左子树最后再右子树。
在这里插入图片描述
在这里插入图片描述

3、代码

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

二、相同的树

力扣题目来源

1、题目描述

在这里插入图片描述

2、思路及演示

此题我们要准确地找到退出循环的条件,总共有三种情况能够跳出循环,第一种情况是两个树都为空,跳出循环为true;第二种情况是一个树为空,另一个树不为空,跳出循环为false;第三种情况为两棵树相对应的结点的值不相同,跳出循环为false。此题的要点在于使用二叉树的前序遍历进行解决,依旧使用递归,递左子树的结点和右子树的结点判断,直到这两棵树全部遍历完。
在这里插入图片描述
这里我们的递归顺序是从下往上的,先比较每个结点的值是否相同,如果不相同则直接返回false,然后再进行递归,先左子树进行递归同样步骤进行判断,比较完左子树再比较右子树即可。

3、代码

bool isSameTree(struct TreeNode* p, struct TreeNode* q){//p和q都为空if( p == NULL && q == NULL)return true;//一个为空一个不为空if(p == NULL || q == NULL)return false;//不相等if(p->val != q->val)return false;//相等递归return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

三、对称二叉树

1、题目描述

力扣题目来源

在这里插入图片描述

2、思路及演示

这里还是一样的思路,找返回条件,总共有三种情况,第一种情况是当左右子树都已经走到NULL的时候,我们返回true即可;第二种情况是左子树结点或者右子树结点有一个到NULL而另一个没有走到NULL,我们返回false;第三种情况是左子树的左结点的值和右子树的右节点不相同我们也返回false或者左子树的右节点的值和右子树的左节点不相同我们也返回false。
在这里插入图片描述

3、代码

bool LeftTreeandRightTree(struct TreeNode* left, struct TreeNode* right)
{if(left == NULL && right == NULL)return true;if(left == NULL || right == NULL || left->val != right->val)return false;int lret = LeftTreeandRightTree(left->left, right->right);int rret = LeftTreeandRightTree(left->right, right->left);return lret && rret;
}

四、二叉树的前序遍历

1、题目描述

力扣题目来源
在这里插入图片描述

2、思路及演示

我们在之前写过二叉树的前序遍历,但这里我们是需要malloc一个数组将数据的值存入进去,然后再去找左子树、右子树即可。
这里的returnSize是一个输出型函数,作用不是很大,但这个returnSize是需要先算出这棵二叉树的结点个数以后赋到returnSize里面的,我们计算二叉树结点个数是计算左右子树的结点数并相加即可。我们看该题目给的函数的参数是root,returnSize,也就意味着没有数组,我们malloc一个数组出来,这个数组的大小就是我们的TreeSize的个数,我们然后进行传参过去,到了preorder函数里面,是有root,数组a和i的,我们根据前序遍历,先根再左子树再右子树,递归调用的结束标志是空结点。注意,这里的数据是存放到数组当中的:
在这里插入图片描述
我们发现非常奇怪的不通过,这怎么调试看起来都没什么问题,既然能通过一部分,肯定是细节出问题了,我们画个图分析一下:
在这里插入图片描述
这里我们发现i是局部变量,当我们遇到这种情况的时候,发现i进入两个递归函数后是一样的值,第二个进入的会将第一个进入的覆盖掉,所以,我们使用取地址的i,是将i整个值进行改变,取地址了是找到这个数的地址,访问去改变,不同的递归以后就会进行更改。

3、代码

int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}void preorder(struct TreeNode* root, int* a, int* pi)
{if(root == NULL)return;a[(*pi)++] = root->val;preorder(root->left, a, pi);preorder(root->right, a, pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize)
{*returnSize = TreeSize(root);int* a = (int*)malloc(*returnSize * sizeof(int));int i = 0;preorder(root, a, &i);return a;
}

五、二叉树的中序遍历&后序遍历

力扣中序遍历题目来源
力扣后序遍历题目来源

1、题目描述

在这里插入图片描述
在这里插入图片描述

2、代码

和前面的二叉树的前序遍历一样,我们这里直接写代码:

int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}void preorder(struct TreeNode* root, int* a, int* pi)
{if(root == NULL)return;preorder(root->left, a, pi);a[(*pi)++] = root->val;preorder(root->right, a, pi);
}int* inorderTraversal(struct TreeNode* root, int* returnSize){*returnSize = TreeSize(root);int* a = (int*)malloc(*returnSize * sizeof(int));int i = 0;preorder(root, a, &i); return a;
}
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0:TreeSize(root->left)+TreeSize(root->right)+1;
}void LastOrder(struct TreeNode* root, int* a, int* pi)
{if(root == NULL)return;LastOrder(root->left, a, pi);LastOrder(root->right, a, pi);a[(*pi)++] = root->val;
}int* postorderTraversal(struct TreeNode* root, int* returnSize)
{*returnSize = TreeSize(root);int* a = (int*)malloc(*returnSize * sizeof(int));int i = 0;LastOrder(root, a, &i);return a;
}

六、另一棵树的子树

1、题目描述

力扣题目来源
在这里插入图片描述

2、思路及演示

本题的关键思路就是将原本的树的所有子树找出来和SubRoot进行比较,这就用到我们第二个写的判断是否是相同的数的代码了,那我们先ctrl+c,ctrl+v过来。此题的做法就是在大树的每个结点上判断该结点是否和SubRoot相等。

判断两个树是否相等的三个条件为且:1、两个树的根节点的值相等。2、并且两个树的左子树都相等。3、并且两个树的右子树都相等。就是合取的关系:即:1 ^ 2 ^ 3

判断SubRoot是否为大的树的子树的三个条件为或:1、两个树的根节点相等。2、或者SubRoot是大的树的左子树。3、或者SubRoot是大的树的右子树。就是析取的关系。即:1 析取 2 析取 3

在这里插入图片描述

3、代码

bool isSameTree(struct TreeNode* p, struct TreeNode* q){//p和q都为空if( p == NULL && q == NULL)return true;//一个为空一个不为空if(p == NULL || q == NULL)return false;//不相等if(p->val != q->val)return false;//相等递归return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root == NULL)return false;if(isSameTree(root, subRoot))return true;return isSubtree(root->left, subRoot)|| isSubtree(root->right, subRoot);
}

七、二叉树遍历

1、题目描述

牛客网题目来源

在这里插入图片描述

2、思路及演示

该题的主要思路是先按照先序遍历的思想,分治的思想,即先利用递归构建出一棵二叉树,构建二叉树的重点思想是先malloc根结点再去构建左子树,最后构建右子树即可。题目中数组a给的是#,我们不能将这个#直接放入到二叉树中,那么就碰到#,我们就跳过,返回NULL,找下一个不是#的值,直到遇到NULL即结束。

在这里插入图片描述

3、代码

#include <stdio.h>
#include<stdlib.h>typedef struct TreeNode {struct TreeNode* left;struct TreeNode* right;char val;
} TreeNode;//创建一个二叉树
TreeNode* CreatTree(char* a, int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));root->val = a[(*pi)];(*pi)++;root->left = CreatTree(a, pi);root->right = CreatTree(a, pi);return root;
}//中序遍历
void InOrder(TreeNode* root)
{if(root == NULL)return;InOrder(root->left);printf("%c ",root->val);InOrder(root->right); 
}int main() {char a[100];scanf("%s", a);int i = 0;TreeNode* root = CreatTree(a, &i);InOrder(root);return 0;
}

总结

二叉树的OJ题层层递进,难度是逐渐上升,我们在把握住每一个OJ题的基础上,同时也需要把握好思想的框架,例如我们第二个的判断相同的树在之后的题目中能够遇到,是需要跳脱出思维的定势的。


家人们不要忘记点赞收藏+关注哦!!!

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

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

相关文章

Flume笔记

Flume 概念 高可用、高可靠&#xff0c;分布式海量日志采集、聚合和传输的系统。 主要作用&#xff1a;实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS 组成 Agent&#xff0c;JVM进程&#xff0c;以事件的形式将数据从源头送到目的地 Agent分为Source、Chann…

李宏毅2021春季机器学习课程视频笔记5-模型训练不起来问题(当梯度很小的时候问题)

求解最小Loss的失败&#xff0c;不能得到最优的值&#xff0c;找不到Loss足够小的值。 1.Loss关于参数的梯度为0&#xff0c;不能继续更新参数。&#xff08;local minima 或者 saddle point&#xff09;如何知道走到了哪个点&#xff1f; 利用泰勒展开&#xff1a; Critical P…

免费ChatGPT接入-国内怎么玩chatGPT

免费ChatGPT中文版 OpenAI 的 GPT 模型目前并不提供中文版的免费使用&#xff0c;但是有许多机器学习平台和第三方服务提供商也提供了基于 GPT 技术的中文版模型和 API。下面是一些常见的免费中文版 ChatGPT&#xff1a; Hugging Face&#xff1a;Hugging Face 是一个开源社区…

Mysql主备一致性保证

大家知道 bin log 既可以用来归档&#xff0c;又可以用来做主备同步。有人可能会问&#xff0c;为什么备库执行了 bin log 就可以跟主库保持一致了呢&#xff1f;bin log的内容是什么样的呢&#xff1f;今天我们就来聊聊它。 在最开始&#xff0c;Mysql 是以容易学习和方便的高…

JDK1.8下载与安装完整教程

目录 一、获取安装资源 1、百度网盘共享 2、官方网站下载(百度网盘文件下载下来有问题情况下) 2.1、搜索jdk官方网站 2.2、进到官网下拉找到Java8&#xff0c;选择Windows 2.3、下载安装程序(下载要登录&#xff0c;没有账号就注册就行) 二、正式安装 1、先在D盘(不在C…

【模型复现】Network in Network,将1*1卷积引入网络设计,运用全局平均池化替代全连接层。模块化设计网络

《Network In Network》是一篇比较老的文章了&#xff08;2014年ICLR的一篇paper&#xff09;&#xff0c;是当时比较厉害的一篇论文&#xff0c;同时在现在看来也是一篇非常经典并且影响深远的论文&#xff0c;后续很多创新都有这篇文章的影子。[1312.4400] Network In Networ…

蓝桥杯刷题冲刺 | 倒计时1天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;蓝桥杯加油&#xff0c;大家一定可以&#x1f43e; 文章目录我是菜菜&#xff0c;最近容易我犯的错误总结 一些tips 各位蓝桥杯加油加油 当输入输出数据不超过 1e6 时&#xff0c;scanf printf 和…

elasticsearch基础6——head插件安装和web页面查询操作使用、ik分词器

文章目录一、基本了解1.1 插件分类1.2 插件管理命令二、分析插件2.1 es中的分析插件2.1.1 官方核心分析插件2.1.2 社区提供分析插件2.2 API扩展插件三、Head 插件3.1 安装3.2 web页面使用3.2.1 概览页3.2.1.1 unassigned问题解决3.2.2 索引页3.2.3 数据浏览页3.2.4 基本查询页3…

微服务+springcloud+springcloud alibaba学习笔记(1/9)

1.微服务简介 什么是微服务呢&#xff1f; 就是将一个大的应用&#xff0c;拆分成多个小的模块&#xff0c;每个模块都有自己的功能和职责&#xff0c;每个模块可以 进行交互&#xff0c;这就是微服务 简而言之&#xff0c;微服务架构的风格&#xff0c;就是将单一程序开发成…

项目管理案例分析有哪些?

项目管控中遇到的问题有哪些&#xff1f;这些问题是如何解决的&#xff1f; 在项目管理领域&#xff0c;案例分析是一种常见的方法来学习和理解项目管理实践&#xff0c;下面就来介绍几个成功案例&#xff0c;希望能给大家带来一些参考。 1、第六空间&#xff1a;快速响应个性…

1669_MIT 6.828 xv6代码的获取以及编译启动

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 6.828的学习的资料从开始基本信息的讲解&#xff0c;逐步往unix的一个特殊版本xv6过度了。这样&#xff0c;先得熟悉一下这个OS的基本代码以及环境。 在课程中其实…

最短路径算法及Python实现

最短路径问题 在图论中&#xff0c;最短路径问题是指在一个有向或无向的加权图中找到从一个起点到一个终点的最短路径。这个问题是计算机科学中的一个经典问题&#xff0c;也是许多实际问题的基础&#xff0c;例如路线规划、通信网络设计和交通流量优化等。在这个问题中&#…

Downloader工具配置参数并烧录到flash中

1 Downloader工具介绍 Downloader工具可以用来烧录固件到设备中&#xff0c;固件格式默认为*dcf。该工具还可以用来在线调试EQ或者进行系统设置。 2 配置参数 2.1 作用 当有一个dcf文件时&#xff0c;配合不同的配置文件*.setting&#xff0c;在不进行编译的情况下&#xff…

【毕业设计】ESP32通过MQTT协议连接服务器(二)

文章目录0 前期教程1 前言2 配置SSL证书3 配置用户名和密码4 配置客户端id&#xff08;client_id&#xff09;5 conf文件理解6 websocket配置7 其他资料0 前期教程 【毕业设计】ESP32通过MQTT协议连接服务器&#xff08;一&#xff09; 1 前言 上一篇教程简单讲述了怎么在虚拟…

【调试】ftrace(三)trace-cmd和kernelshark

之前使用ftrace的时候需要一系列的配置&#xff0c;使用起来有点繁琐&#xff0c;这里推荐一个ftrace的一个前端工具&#xff0c;它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git clone https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ c…

【Ruby学习笔记】19.Ruby 连接 Mysql - MySql2

Ruby 连接 Mysql - MySql2 前面一章节我们介绍了 Ruby DBI 的使用。这章节我们技术 Ruby 连接 Mysql 更高效的驱动 mysql2&#xff0c;目前也推荐使用这种方式连接 MySql。 安装 mysql2 驱动&#xff1a; gem install mysql2你需要使用 –with-mysql-config 配置 mysql_conf…

【DevOps】GitOps 初识(下) - 让DevOps变得更好

实践GitOps的五大难题 上一篇文章中&#xff0c;我们介绍了GitOps能为我们带来许多的好处&#xff0c;然而&#xff0c;任何新的探索都将不会是一帆风顺的。在开始之前&#xff0c;如果能了解实践GitOps通常会遇到的挑战&#xff0c;并对此作出合适的应对&#xff0c;可能会使…

数据结构和算法(一):复杂度、数组、链表、栈、队列

从广义上来讲&#xff1a;数据结构就是一组数据的存储结构 &#xff0c; 算法就是操作数据的方法 数据结构是为算法服务的&#xff0c;算法是要作用在特定的数据结构上的。 10个最常用的数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10…

StorageManagerService.java中的mVold.mount

android源码&#xff1a;android-11.0.0_r21&#xff08;网址&#xff1a;Search (aospxref.com)&#xff09; 一、问题 2243行mVold.mount执行的是哪个mount函数&#xff1f; 2239 private void mount(VolumeInfo vol) { 2240 try { 2241 // TOD…

【LeetCode】-- 108. 将有序数组转换为二叉搜索树

1. 题目 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;其中元素已经按升序排列&#xff0c;请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 …