(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习

news2024/9/22 1:25:27

在这里插入图片描述

二叉树基础oj练习

  • 965. 单值二叉树
    • 题目
    • 解法
  • 100. 相同的树
    • 题目
    • 解法
  • 101. 对称二叉树
    • 题目
    • 解法
  • 144. 二叉树的前序遍历
    • 题目
    • 解法
  • 94. 二叉树的中序遍历
    • 题目
    • 解法
  • 145. 二叉树的后序遍历
    • 题目
    • 解法
  • 572. 另一棵树的子树
    • 题目
    • 解法
  • KY11 二叉树遍历
    • 题目
    • 解法
  • 结语

965. 单值二叉树

题目

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

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

题目链接:单值二叉树

解法

代码如下:

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

首先判定二叉树是否为空,如果为空,直接返回true即可
再判定左右子树是否等值,不等返回false
嵌套递归下一层左右子树
遍历完都没进入条件语句,说明都相等,返回true

100. 相同的树

题目

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

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

题目链接:相同的树

解法

代码如下:

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

首先判定两树是否均为空,如果都为空,则返回true
有一个不为空则返回false
都不为空再比较值,不等则返回false
再向下递归遍历左右子树即可。

101. 对称二叉树

题目

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

题目链接:对称二叉树

解法

代码如下:

bool ret(struct TreeNode* p,struct TreeNode* q)
{
    if(!p&&!q)
        return true;
    else if(!p||!q)
        return false;
    else if(p->val!=q->val)
        return false;
    else
        return ret(p->left,q->right)&&ret(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){
    return ret(root,root);
}

这里还是使用递归的写法,由于这个算法需要两个参数实现,所以我们再写一个ret函数来实现,最后返回ret函数返回值即可

和上一题类似,如果树为空,则返回true,后面递归遍历时,是左右对称点比较
第二个条件也是为了后期递归时判断左右对称点是否一个为空,则返回false
第三个条件同理,判断值是否不等,不等则返回false
最后递归左右对称点,遍历整个二叉树。

144. 二叉树的前序遍历

题目

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

题目链接:二叉树的前序遍历

解法

代码如下:

void _preorder(struct TreeNode*root,int* ret,int* returnSize)
{
    if(root==NULL)
        return;
    ret[(*returnSize)++]=root->val;
    _preorder(root->left,ret,returnSize);
    _preorder(root->right,ret,returnSize);
} 
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret=malloc(sizeof(int)*200);
    *returnSize=0;
    _preorder(root,ret,returnSize);
    return ret;
}

首先我们开辟一个数组空间,题目要求是[0,100],我这里是直接给了200,将returnSize初始化为0
再调用子函数,子函数首先判定结点为空直接不返回值
下面的三个就是关键了
前序遍历是按照二叉树根左右的顺序,所以
先将根节点的值放入数组,在递归遍历左子树,再递归遍历右子树
最后返回数组,结果即为二叉树的前序遍历。

94. 二叉树的中序遍历

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

题目链接:二叉树的中序遍历

解法

代码如下:

void _inorder(struct TreeNode*root,int* ret,int* returnSize)
{
    if(root==NULL)
        return;
    _inorder(root->left,ret,returnSize);
    ret[(*returnSize)++]=root->val;
    _inorder(root->right,ret,returnSize);
} 
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret=malloc(sizeof(int)*200);
    *returnSize=0;
    _inorder(root,ret,returnSize);
    return ret;
}

和上面的题目思路是一样的,只不过中序遍历顺序为左根右
所以我们将子函数稍微调整,先遍历左子树,再记录根节点,最后遍历右子树

145. 二叉树的后序遍历

题目

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

题目链接:二叉树的后序遍历

解法

代码如下:

void _posorder(struct TreeNode*root,int* ret,int* returnSize)
{
    if(root==NULL)
        return;
    _posorder(root->left,ret,returnSize);
    _posorder(root->right,ret,returnSize);
    ret[(*returnSize)++]=root->val;
    
} 
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    int* ret=malloc(sizeof(int)*200);
    *returnSize=0;
    _posorder(root,ret,returnSize);
    return ret;
}

和上面的题目思路还是一样的,只不过后序遍历顺序为左右根
所以我们将子函数稍微调整,先遍历左子树,再遍历右子树,最后记录根节点

572. 另一棵树的子树

题目

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

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

题目链接:另一棵树的子树

解法

代码如下:

bool check(struct TreeNode* o, struct TreeNode* t)
{
    if (!o && !t) 
        return true;
    if ((o && !t) || (!o && t) || (o->val != t->val)) 
        return false;
    return check(o->left, t->left) && check(o->right, t->right);
}

bool isSubtree(struct TreeNode* o, struct TreeNode* t)
{
    if (!o) 
        return false;
    return check(o, t) || isSubtree(o->left, t) || isSubtree(o->right, t);
}

首先我们判定如果树为空直接返回false
再看下面的返回第一个条件
主树和子树如果都为空则返回true,只有一个为空或则值不相等则返回false
再比较主树的左子树和子树的左子树以及主树的右子树和子树的右子树
遍历完如果相同则为true,如果不同则向左子树再与子树比较,左子树不同再与右子树比较
都不同最后就返回false

KY11 二叉树遍历

题目

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

题目链接:二叉树遍历

解法

代码如下:

#include <stdio.h>
typedef struct TreeNode
{
        int* val;
        struct TreeNode* left;
        struct TreeNode* right;
}TreeNode;
TreeNode* creatTree(char* s,int* count)
{
        if(s[*count]=='#'||s[*count]=='\0')
                return NULL;
        TreeNode* newtree = malloc(sizeof(TreeNode));
        newtree->val=s[(*count)++];
        newtree->left=creatTree(s,count);
        (*count)++;
        newtree->right=creatTree(s,count);
        return newtree;
}
void inorder(TreeNode* root)
{
        if(root==NULL)
                return;
        inorder(root->left);
        printf("%c ",root->val);
        inorder(root->right);

}
int main() {
    char s[200];
    scanf("%s",&s);
    int count=0;
    TreeNode* root=creatTree(s,&count);
    inorder(root);
    return 0;
}

首先是二叉树结构体的建立
包含值val和左右子树节点
然后是建二叉树,分别有输入值的字符串数组和初始化下标0两个参数
如果该元素为#或者\0则直接返回空即可
上述条件语句不执行则创建节点,根据二叉树前序遍历的顺序,先输入根的值,再遍历左子树,最后遍历右子树
然后是中序输出函数,节点为空,直接返回,
不执行上述条件语句,则按中序输出顺序,先遍历左子树节点,再输出根节点,最后遍历右子树节点
再看主函数
根据题意不超过100个字符,这里我直接给了200空间
然后就是输入字符串,初始化count为0,为了记录下标
最后调用建树和中序输出两个函数即可

结语

这里的解法代码部分来自力扣官方和作者自己的解法,作者只是进行了详细的剖析和部分改动方便大家理解和提升自己,学会多角度观察问题,解决问题。

有兴趣的小伙伴可以关注作者,如果觉得内容不错,请给个一键三连吧,蟹蟹你哟!!!
制作不易,如有不正之处敬请指出
感谢大家的来访,UU们的观看是我坚持下去的动力
在时间的催化剂下,让我们彼此都成为更优秀的人吧!!!
在这里插入图片描述

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

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

相关文章

Linux安装MongoDB数据库并内网穿透在外远程访问

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 转发自CSDN cpolarlisa的文章&#xff1a;Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透…

LeetCode572. 另一棵树的子树LeetCode

572. 另一棵树的子树 描述示例解题思路以及代码 描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节…

数据库|SQL调优案例之TiFlash帮倒忙该怎么办?

一、背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个S…

Flink消费pubsub问题

我看网上flink消费pubsub的资料并不多&#xff0c;最近跑通了&#xff0c;大家有问题的可以给我留言。 一、基本资料 1.flink官网接入方式 Google Cloud PubSub | Apache Flink StreamExecutionEnvironment streamExecEnv StreamExecutionEnvironment.getExecutionEnviron…

Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放

技术背景 我们在对接开发者的时候&#xff0c;遇到这样的诉求&#xff1a;除了正常的RTMP、RTSP直播播放外&#xff0c;有些硬件设备输出编码后&#xff08;H.264/H.265&#xff09;的数据&#xff0c;比如无人机或类似硬件产品&#xff0c;回调出来的H.264/H.265数据&#xf…

C#中的委托是什么

https://www.cnblogs.com/deepalley/p/12150931.html 1.什么是委托&#xff1f;&#xff08;方法作另一个方法的参数&#xff09; delegate void MyDel(int value); //声明委托类型 和类一样&#xff0c;委托是用户自定义的类型&#xff0c;但是类是数据和方法的集合&#…

vue实现功能完整的购物商城,商品零食、电商通用商城

目录 一、项目结构 1.项目截图 2.项目简介 3.项目布局 二、首页 1.效果图 2.源码 三、商品详情 1.效果图 2.源码 四、分类 1.效果图 五、购物车、提交订单 1.效果图 六、个人中心 1.源码结构 2、效果图 七、总结 一、项目结构 1.项目截图 2.项目简介 项目基于vue…

海睿思分享 | 一文读懂企业数据资产目录建设的重要性

小王是某公司信息化部门负责人。 某天&#xff0c;公司领导需要获取近三年来生产部门的人员信息全面数据&#xff0c;小王费了九牛二虎之力&#xff0c;召开了各种会议&#xff0c;在各个系统里来回找数据&#xff0c;最终找到了这些数据。然而领导所需的人员职称、人员获奖信…

UOS服务器系统配置bond

一、Bond介绍 bond可以将多个网卡绑定到一起&#xff0c;可以让两个或多个接口作为一个接口&#xff0c;同时提高带宽&#xff0c;并提供网络链路的冗余&#xff0c;当有其中一块网卡故障的时候&#xff0c;不会中断服务器的业务。 二、Bond模式 1、mode0&#xff08;balanc…

老杨说运维 | 运维数智化转型正确打开方式是什么?他这样说

2023年5月9日&#xff0c;中国计算机用户协会信息科技审计分会会员大会暨金融科技风险管理与审计论坛成功于北京召开。擎创科技CEO杨辰受邀与会&#xff0c;并分享了在数智运维发展过程中对企业数智化转型建设的规划思考以及相关实践经验。 同时&#xff0c;年会上举行了“金融…

《基础知识》提示学习的基本知识

《基础知识》提示学习的基本知识 提示学习背景提示的形式和元素提示学习的输入形式提示学习的重要元素提示学习的输入形式举例基本提示任务提示学习 内容参考:打工人转型之道(二):提示工程(Prompt Engineering)进阶篇

【服务器】利用树莓派搭建 web 服务器【无需公网IP】

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 概述 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 设置 Apache Web 服务器 测试 web 站点 安装静态样例站点 将web站点发布到公网 安装 Cpolar内网穿透 cpolar进行tok…

基于 FPGA 的彩色图像灰度化的设计实现(image_stitche_x)

文章目录 前言一、图像合并模块的设计二、仿真文件 前言 image_stitche_x 模块&#xff1a;将串口接收的尺寸为 400480 大小的彩色图像与灰度化处理后的 400480 大小的图像数据以左右形式合并成一张 800*480 的图像。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

AI再度升级,IT业一片哀鸿遍野:程序员真的要失业了吗?

IT人员真的要失业了吗&#xff1f; 随着各个大厂已经相继传来裁员&#xff0c;降薪&#xff0c;减招的消息和ChatGPT等大型AI模型可以定制化写参考代码&#xff0c;甚至通过外接API直接帮助操作&#xff0c;IT人员似乎越来越不吃香了。 其实&#xff0c;ChatGPT有用的不是取代…

Diango学习-用户管理系统(简单部门管理、用户管理)

目录 1、创建项目和app 1.创建项目 2.创建app 2种创建方式 注册app 2、表结构的创建 Django中的模型字段有很多种&#xff0c;包括但不限于&#xff1a; 设计表结构&#xff08;Django&#xff09; 在models.py文件中创建表&#xff1a;部门表和员工表 加入性别列&…

FL Studio21.0.3.3517完整试用版

系统要求 FL STUDIO 可以运行在任何计算机上: 支持 WINDOWS: 7, 8, 10 或者更高版本 支持 MacOS: 10.11 或更高版本 不低于 4GB 的可用硬盘空间 建议最低 4GB 内存或 更高 当然CPU 越强大&#xff0c;也就意味着你运行的音源和效果器越多! FL Studio是一个非常受欢迎的数…

轻松实现远程访问本地wamp服务器,无公网IP也不怕,「内网穿透」

目录 前言 1.Wamp服务器搭建 1.1 Wamp下载和安装 1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册 2.1 本地网页发布 2.2 Cpolar云端设置 2.3 Cpolar本地设置 3. 公网访问测试 4. 结语 转载自cpolar极点云的文章&#xff1a;无公网IP&#xff1f;教你在外远程访问本地…

新零售发展现状剖析

“新零售”的商业生态将涵盖网络页面、实体店面、支付终端、数据系统、物流平台和营销路径等诸多方面。 企业通过使用大数据和人工智能等先进技术升级产品的生产、流通和销售流程&#xff0c;重塑商业结构与生态圈&#xff0c;深度融合线上服务、线下体验和现代物流。将物流、…

Devexpress GridControl 内部调用外面实现的FocusedRowChanged

个人需求是网格自带的条件发生改变时&#xff08;网格显示的内容会发生改变&#xff09;&#xff0c;同时需要刷新另一个网格的数据源&#xff0c;而另一个网格的数据源是走的这个网格的行焦点改变事件去刷新&#xff0c;自带的条件发生改变时并不会触发行焦点的改变 当前情况…

【HTTP协议】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. HTTP协议概述 2. HTTP协议的工作过程 3.…