二叉树刷题(1)

news2024/11/15 17:39:18

二叉树题目讲解(1)

  • 一、构建二叉树并且遍历
    • (1)思路
    • (2)代码
  • 二、对称二叉树
    • 1、思路
    • 2、代码
  • 三、相同的树
    • 1、思路
    • 2、代码
  • 四、单值二叉树
    • 1、思路
    • 2、代码
  • 五、另一棵树的子树
    • 1、思路
    • 2、代码

一、构建二叉树并且遍历

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

输出:c b e g d f a

(1)思路

1、首先读完题目我们需要明白题目的意思:
输入一串字符(前序遍历)根据我们的字符串构建我们的二叉树,然后再中序遍历
在这里插入图片描述
构建树的过程如图所示,先创建根节点,然后遍历左子树,然后右子树,所以建树的过程是递归的过程。

2、我们该如何实现呢?
(1)首先我们先创建一个字符数组将我们的字符串放入,因为是数组所以我们需要一个下标来访问我们的数组,但由于我们的建树过程是递归的,所以我们的下标需要在main函数里定义。
(2)然后就进入我们的建树函数里,结束条件是什么呢?大家想如果遇到空是不是就要返回到上一级,所以结束条件就是如果遇到‘#’就返回,并且由于这是在数组里,我们需要下标++。
(3)然后我们就可以开始我们的建根,如果当前数组元素不为“#”就创建根节点,
那根节点的左子树怎么办?那我们就递归,根的left就直接递归,右孩子同理。

这里体现了我么的分置的思想。

(2)代码

#include <stdio.h>
#include<string.h>

typedef struct treenode
{
    char val;
    struct treenode*left;
    struct treenode*right;
}TNode;//定义树的节点

TNode*createtree(char*arr,int*i)
{
    if(arr[*i]=='#')//如果当前节点为空就返回上一级
    {
        (*i)++;
        return NULL;
    }
    TNode*root=(TNode*)malloc(sizeof(TNode));//创建根节点
    root->val=arr[(*i)++];
    root->left=createtree(arr,i);//递归根的左子树
    root->right=createtree(arr,i);//递归根的右子树
    return root;//最后返回根节点即可
}
void midtravel(TNode*root)//中序遍历
{
    if(root==NULL)
        return;
    midtravel(root->left);
    printf("%c ",root->val);
    midtravel(root->right);
}
int main() {
    char arr[100];
    gets(arr);//得到我们的字符串
    int i=0;
    TNode*root=createtree(arr,&i);//为什么这里用i的地址
    //这是因为如果值传递在递归里我们加不上去
    midtravel(root);
    return 0;
}

二、对称二叉树

题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。
示例:
在这里插入图片描述

1、思路

这道题我们的思路是什么呢?

(1)首先我们需要明白什么样的树才是我们的对称二叉树,是不是左子树的左子树等于右子树的右子树,右子树的左子树等于左子树的右子树,那这里跟我们的根节点有关系吗?所以如果我们的根为空就返回true,如果不为空就进入判断左子树与右子树是否是镜像的。
(2)在函数里我们怎么实现呢?首先我们需要判断左子树与右子树是否都为空,如果都为空,那我们的树只有一个根节点,那就返回true,然后我们需要判断是否有一个子树为空,如果有的话那我们的树就不是镜像二叉树。
(3)上面完成以后我们的树就一定有两颗子树,但我们还没有比较它们的值是否相等,如果不相等就返回false,然后再比较左子树的左子树与右子树的右子树是否相等,再比较右子树的左子树是否与左子树的右子树相等即可

2、代码

bool _isSymmetric(struct TreeNode*p,struct TreeNode*q)
 {
    if(p==NULL&&q==NULL)//如果左右子树都为空
        return true;
    if(p==NULL||q==NULL)//第一个if排除了两者都为空的情况,这里判断是否有一个不为空
        return false;
    if(p->val!=q->val)
        return false;
    return _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);
 }
bool isSymmetric(struct TreeNode* root)
 {
    if(root==NULL)//如果根节点为空,就是空树
        return true;
    return _isSymmetric(root->left,root->right);
}

三、相同的树

题目描述
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例:
在这里插入图片描述

1、思路

在完成了上面的对称二叉树后这道题就简单很多嘛!
首先我们需要判断两棵树是否都为空以及一个不为空一个为空这两种情况,在判断完上面以后我们的两棵树一定都有根节点,然后我们判断根的值是否相等,最后遍历我们的左树的左树与右数的左树,左树的右树与右树的右树即可。

2、代码

bool isSameTree(struct TreeNode* p, struct TreeNode* 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);
}

四、单值二叉树

题目描述:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例:
在这里插入图片描述

1、思路

这道题我们首先需要判断树是否为空,如果为空则返回true,如果不是空树,我们就比较左子树的值与根节点的值是否相等,再比较右子树的值与根节点是否相等,如果不相等则返回false,最后递归我们的左子树与右子树。
这里也走的我们的分治的思想。

2、代码

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

五、另一棵树的子树

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

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

示例:
在这里插入图片描述

1、思路

这道题其实思路非常的简单,我们不是求是否为子树嘛,那我们可以走一个前序遍历,比较每一个节点作为树与右边的所求的子树,再走一个issametree即可。

2、代码

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

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL&&subRoot==NULL)
        return true;
    if(root==NULL||subRoot==NULL)
        return false;
    if(issametrue(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

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

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

相关文章

【Rust日报】一本新书:黑帽Rust

2024 Rust中国大会大会将于 9 月 07 日 - 08 日在上海举办。精彩议题逐步放出中&#xff0c;欢迎大家面对面交流。 2024 Rust中国大会报名链接暨第一批精彩演讲主题介绍 2024 Rust中国大会第二批精彩演讲主题列表 2024 Rust中国大会第三批精彩演讲主题列表 马尔科夫文本生成算法…

多线程(5)——锁策略、CAS、JUC常见类

1. 常见锁策略 1.1 乐观锁 & 悲观锁 乐观锁 & 悲观锁 也不是指具体某个锁&#xff0c;而是 “锁的一种特点”&#xff0c;描述了 “一类锁” 乐观锁&#xff1a;加锁的时候&#xff0c;假设出现锁冲突的概率不大 > 接下来围绕加锁要做的工作就会更少悲观锁&#…

minio 后端大文件分片上传,合并,删除分片

背景 网上大多数minio大文件上传都是采用后台返回前端预上传链接&#xff0c;然后由前端去put请求直接和minio通信上传分片文件&#xff0c;然后调用后台合并分片逻辑来达到快申诉上传的目的&#xff0c;详情可以参考我的上两篇文章 最近有个项目域名是https的&#xff0c;但…

# 低代码和无代码开发初探

低代码和无代码开发初探 低代码和无代码都是近年来在软件开发领域兴起的技术趋势&#xff0c;它们旨在提高开发效率、降低开发门槛&#xff0c;让更多人能够参与到软件开发过程中。以下是对低代码和无代码的介绍&#xff1a; 一、低代码 1、低代码定义 低代码开发平台&…

Linux nice/renice 命令 - 进程的NI、PRI属性

进程NI、PRI属性的联系 共同影响进程调度&#xff1a;NI和PRI都是Linux进程调度机制中的重要参数&#xff0c;它们共同决定了进程在CPU资源竞争中的优先级。NI值通过影响PRI值来间接影响进程的调度顺序。NI值可调整以改变PRI值&#xff1a;用户可以通过调整进程的NI值来间接改…

较难!第15届蓝桥杯青少组省赛Scratch中级组编程真题

今天上午第15届蓝桥杯青少组省赛Scratch初级组考完试以后&#xff0c;Scratch实验室就预估今天下午的Scratch中级组比较难&#xff0c;结果不出所料&#xff0c;还是比较有难度&#xff0c;据好几个学生及家长说&#xff0c;好几道题不会做时间不够。 来源&#xff1a;结束啦&a…

三级_网络技术_43_综合题(报文)

一、 某客户机使用DHCP获取IP地址等信息&#xff0c;其获取lP地址过程中捕获的4条报文及对第2条报文分析如下所示。请分析其中的信息&#xff0c;补全内容。 编号 报文摘要 DHCP:Request, Type:DHCP discover DHCP:Reply, Type:DHCP__________ DHCP:Request, Type:DHCP Re…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

人生苦短,转行程序员要趁早啊

前言 最近有朋友咨询关于如何自学编程语言的问题&#xff0c;发现要回答这个问题&#xff0c;不是一俩句就可以回答清楚并减少当事人的困惑和迷茫。 笔者不知道提问者是问的学习方法还是学习路径&#xff0c;所以特此写一篇文章&#xff0c;斗胆表达一下我对自学编程的一点点…

解决Gradle下载依赖速度慢的问题

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

盘古信息MES制造执行系统,赋能制造企业智能化运营管理

随着工业智能化的不断深入&#xff0c;MES系统在制造业中扮演着越来越重要的角色。盘古信息自主研发的IMS MES&#xff0c;通过提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、设备管理、采购管理、成本管理、看板管理、生产过程控制、…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

排查Maven问题的步骤

0.检查pom文件完整性 1.检查IDEA中配置是否正确 2.使用清楚工具将所有的lastupdate清除, 3.有些依赖是公司的依赖 —>配置私服 —>拷贝同事仓库,覆盖自己的仓库 4.有了私服地址,但是还是下载不到 —>查看地址是否能访问 —>挂VPN

linux多进程与多线程总结

这里写自定义目录标题 2 linux多进程与多线程2.1 进程间通信2.1.1 管道2.1.2 信号2.1.3 消息队列2.1.4 共享内存 3 线程4 IO多路复用4.1 非阻塞IO4.2 IO多路复用 2 linux多进程与多线程 学习并发程序。 linux系统中&#xff0c;使用树型管理进程。因此进程之间有父子关系。通…

如何使用ssm实现学生公寓管理系统的设计与实现

TOC ssm106学生公寓管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

LeetCode.3146.两个字符串的排列差

题目描述&#xff1a; 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 输入输出示例&#xff1a; 思路一&#xff1…

TMC2209模块开启无限位归零

TMC2209无限位归零配置步骤&#xff1a; 3.1 配置内部采样电阻。具体在GCONF中internal_Rsens 1&#xff1b; 此步发送数据 05 00 80 00 00 00 83 00 3.2 电机电流设置&#xff0c;配置IHOLD_RUN寄存器&#xff1b; 此处发送数据 05 00 90 00 00 16 16 12 3.3 设置失速电流阈…

QT接收并解析GPS模块串口数据

目录 一、QT读取串口数据 二、解析数据 目标&#xff1a; 使用QT&#xff0c;读取gps模块的串口数据&#xff0c;并解析其中的经纬高数据&#xff0c;然后进行处理 一、QT读取串口数据 变量定义 QSerialPort *serial; QSerialPortInfo SerialPortInfo; QByteArray lineData…

Deepin【2】:Deepin系统盘扩容

Deepin【2】&#xff1a;Deepin系统盘扩容 1、进入live系统1.1、live系统入步骤 2、连接网络3、新增系统仓库4、安装gparted应用5、使用gparted进行扩容操作5.1、观察当前分区5.2、压缩data分区5.3、Rootb分区合并空闲空间5.4、Rootb分区压缩空间5.5、Roota合并空闲空间5.6、核…