二叉树——二叉树的构建及遍历

目录

1:题目分析和思路

1:分析

2:思路

2:代码实现及分析

1:构建结构体

2:主函数

2:创建二叉树

3:中序遍历

3:总代码


1:题目分析和思路

1:分析

读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。

例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果

2:思路

字符串:ABC##DE#G##F### 的二叉树展开图如下

上图是我们用前序(根 左子树 右子树)对字符串数组进行展开,通过以上的展开,可以方便我们更好的理解和代码的书写以及我们思路的展开;

通过对字符串的展开,我们接下来需要先读取字符串、构建二叉树 并用中序打印二叉树;

2:代码实现及分析

1:构建结构体

typedef struct BinTreeNode
{
    struct BinTreeNode* left;
    struct BinTreeNode* right;
    char val;
}BTNode;

我们要先建立一个结构体,根节点val,左子树left,右子树right

2:主函数

int main()
{
    char a[100];
    //读入字符串
    scanf("%s", &a);

     //创建二叉树
    int i = 0;
    BTNode* root = CreateTree(a, &i);
    //中序打印二叉树
    InOrder(root);

    return 0;
}

分析:首先我们在main函数中接收一下字符串的值,因为题目归定了字符串不超过100,所以我们让a的范围到100,然后用scanf来读取,并且需要创建一颗二叉树,创建好以后再按照题目要求用中序打印二叉树

这里我们在对下标i进行传值时,需要传地址(&),以便于我们改变实参(++i)时形参也跟着改变

2:创建二叉树

//创建二叉树
BTNode* CreateTree(char* a, int* pi)
{
    if (a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = a[(*pi)++];
    root->left = CreateTree(a, pi);
    root->right = CreateTree(a, pi);
    return root;
}

实参i的地址我们用*pi来接收 

分析:当a[*pi]访问到字符串的值是字符是'#'时,我们让(*pi)向后++(字符位置向后移动一个位置),然后返回NULL,访问到'#'就说明访问到叶子节点的左右子树了;

如果没有访问到'#',就说明访问到了值,我们为这个值开辟一块空间,然后我们让二叉树的值(val)的指针*pi向后++让指针指向下一个字符(字符位置向后移动一个位置)

然后我们进行递归调用,让root->left和root->right都进行递归,并创建我们访问到的值左右子树

3:中序遍历

//中序打印二叉树
void InOrder(BTNode* root)
{
    if (root == NULL)
        return;
    InOrder(root->left);
    printf("%c ", root->val);
    InOrder(root->right);
}

分析:如果树是空树,直接返回;然后用按照中序的方法(左子树 根 右子树)递归树的左边 打印根节点  在递归树的右边

3:总代码

#include <stdio.h>
#include <stdlib.h>

typedef struct BinTreeNode
{
    struct BinTreeNode* left;
    struct BinTreeNode* right;
    char val;
}BTNode;

//创建二叉树
BTNode* CreateTree(char* a, int* pi)
{
    if (a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = a[(*pi)++];
    root->left = CreateTree(a, pi);
    root->right = CreateTree(a, pi);
    return root;
}

//中序打印二叉树
void InOrder(BTNode* 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;
    BTNode* root = CreateTree(a, &i);
    //中序打印二叉树
    InOrder(root);

    return 0;
}

以上就是二叉处OJ———二叉树构建及遍历的所有分析和理解了,创作不易,求求大家点个小赞赞,感谢各位大佬们的赏脸观看,随手点个赞,养成好习惯,如有问题,感谢反馈!

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

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

相关文章

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞&#xff08;一&#xff09; 专项漏洞部分注重测试方法论&#xff0c;每个专项仅列举一个例子。实际测试过程中&#xff0c;需视情况而定。 文章目录 Web应用安全测试-专项漏洞&#xff08;一&#xff09;Web组件&#xff08;SSL/WebDAV&#xff09;漏…

力扣爆刷第155天之TOP100五连刷41-45(下一个排列、正序数组中位数、归并排序链表)

力扣爆刷第155天之TOP100五连刷41-45&#xff08;下一个排列、正序数组中位数、归并排序链表&#xff09; 文章目录 力扣爆刷第155天之TOP100五连刷41-45&#xff08;下一个排列、正序数组中位数、归并排序链表&#xff09;一、31. 下一个排列二、4. 寻找两个正序数组的中位数三…

明明设置允许跨域,为什么还会出现跨域请求的问题

一、问题 在微服务项目中&#xff0c;明明已经设置允许跨域访问&#xff1a; 为什么还会出现跨域请求问题&#xff1f; 二、为什么 仔细查看错误提示信息&#xff1a;When allowCredentials is true, allowedOrigins cannot contain the special value "*" since t…

单元测试,一直转圈,既不报错也不运行结束(ssm junit4 test )

修改dataSource.properties文件 然后把mysql.version的版本修改为8.x.x 如果没有效果&#xff0c;再看看连接数据库的用户名和密码是否正确&#xff0c;一般是连接数据库出了错&#xff0c;单元测试才回一直转圈&#xff0c;我是检查了一上午才发现&#xff0c;用户名错了。 检…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中&#xff0c;名称为jmeter.log。我们可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起 另外&#xff0c;Jmeter可以很方便地设置日志输出级别&#xff1a; 通过这种方式修…

工业制造业怎样进行进行智能、高效的机台文件管控?

对于工业制造业而言&#xff0c;机台是极为关键的基础设施&#xff0c;是正常生产经营的前提。工业制造业的机台包括很多种类&#xff0c;数控机床、防静电工作台、旋转工作台、机床工作台、车床等。 工业制造业机台产生的文件类型也有很多种类&#xff0c;如&#xff1a; 工艺…

NUC 14 Pro+:超越想象,夏日必备神机

夏日最让打工人意难平的大概是呼呼作响的主机风扇&#xff0c;即使在凉爽的空调房中&#xff0c;轰响的主机也让人心浮气躁。要怎样才能与它和平共处&#xff1f;它怎么就不明白&#xff0c;安安静静的陪伴真的很重要&#xff01; 这时候NUC 14 Pro 就是你最佳的伙伴 &#xff…

【专业性强】地球科学SCI期刊,中科院2区,学术影响力大

一、期刊名称 GIScience & Remote Sensing 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;地球科学 影响因子&#xff1a;6.7 中科院分区&#xff1a;2区 三、期刊征稿范围 GIScience & Remote Sensing是一本完全开放获取的期刊&#xff0c;发表…

音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理 1 视频为什么需要进行编码压缩 ◼ 一张为 720x480 的图像&#xff0c;用 YUV420P 的格式来表示&#xff0c;其大小为&#xff1a; 720*480*1.5 约等于 0.5MB 。 ◼ 如果是 25 帧&#xff0c; 10 分钟的数据量 0.5M*10*60*25 7500MB -> 7GB 多 ◼ …

RestTemplate修改默认转换器,使用FastJsonConverter

问题描述&#xff1a; 在使用RestTemplate发送POST请求时&#xff0c;发现发送的数据并未按配置的JSONField转换&#xff0c;导致服务方一直收不到参数 排查过程&#xff1a; 将itemList改成Items传输即可 原因分析&#xff1a; RestTemplate有默认的转换器&#xff0c;所以…

引入基于图的增强框架实现大模型的可控文本生成

尽管LLMs能够生成丰富多样的文本&#xff0c;但它们在生成特定属性文本时仍面临挑战。例如&#xff0c;如何确保生成的文本不仅语言流畅、语义准确&#xff0c;同时还具有所需的情感色彩或避免包含不当内容&#xff0c;是一个亟待解决的问题。传统的可控文本生成&#xff08;CT…

2. jenkins发布java项目

jenkins发布java项目 一、环境描述二、部署tomcat业务服务器三、部署git服务器&#xff0c;上传测试代码1、部署git服务器2、上传测试代码 四、jenkins对接组件1、安装必要的插件2、对接git客户端3、对接maven工具4、配置maven需要的jdk5、配置gitlab服务器的连接6、在jenkins上…

windows下载jdk并安装步骤(保姆级教程)

一、下载jdk 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二、双击下载好的jdk 更改安装目录然后点击下一步 然后会弹出jre的安装&#xff0c;需要选择路径&#xff08;注意&#xff1a;这里的路径必须跟前面的jdk在…

如何在Java中使用Levenshtein距离实现字符串相似度匹配

在许多应用中&#xff0c;我们需要根据用户输入的问题找到最匹配的已知问题。Levenshtein距离&#xff08;编辑距离&#xff09;是一个强大的工具&#xff0c;可以帮助我们衡量两个字符串之间的差异&#xff0c;并进一步计算它们的相似度。本文将使用一个具体的例子来展示如何在…

ESXI存储设备已经分区,无法创建数据存储。

问题:ESXi 存储设备已经分区完成&#xff0c;并且有 VMFS 文件系统&#xff0c;无法创建数据存储&#xff0c;选项是灰色。 解决办法&#xff1a;通过命令行工具 在现有的 VMFS 分区上创建数据存储。 在现有的 VMFS 分区上创建数据存储 1.ESXI开SSH2.windows自带CMD登入ESXI。&…

创意学生木工工具——木工锯床

开展创意木工课程丰富了学校的课程多样性&#xff0c;强化了实践教育&#xff0c;并实现了跨学科的融合&#xff0c;在教育理念方面&#xff0c;创意木工课程强调了学生的主体地位&#xff0c;注重了学生的全面发展&#xff0c;并倡导了实践育人的理念&#xff0c;培养学生的综…

NGINX配置web文件服务

一、需求描述 系统需要提供文件&#xff08;pdf、图片&#xff09;等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项&#xff0c;表示更改目录及其所有子目录和文件的权限。arwx 是权限设置&#xf…

零知识学习之DPDK与RDMA(2)—— 认识DPDK(2)

接前一篇文章&#xff1a;零知识学习之DPDK与RDMA&#xff08;1&#xff09;—— 认识DPDK&#xff08;1&#xff09; 本文内容参考&#xff1a; 《Linux高性能网络详解 从DPDK、RDMA到XDP》 刘伟著 人民邮电出版社 https://blog.51cto.com/u_15301988/5181201 特此致谢&…

FineReport填报列权限控制

近期换东家啦&#xff0c;又回归使用帆软啦&#xff0c;对于填报报表列权限的控制我这边顺带记录一下 首先讲解下场景&#xff1a;填报报表需要不同角色决定对不同列是否有填写或者查看权限 以填写权限为例&#xff0c;首先考虑用到的是 帆软自带的权限编辑&#xff0c;其次考虑…

SQL Server2014 公司速通版

1、SQL Server 了解 SQL Server 2014是Microsoft公司推出的一款关系型数据库管理系统&#xff0c;它在数据库领域具有广泛的影响力和应用。 1.1 SQL Server 2014 主要特性【简单了解就行】 SQL Server 2014 引入了一系列新特性和改进&#xff0c;这些特性和改进旨在提高性能、增…