【刷题】二叉树遍历思路解析

news2024/10/6 2:22:26

二叉树遍历 (牛客网)

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

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

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

示例1
输入:
abc##de#g##f###
输出:
c b e g d f a

思路:
(要点须知:1.先序遍历:先看root(根节点),再左孩子节点,最后右孩子节点
2.中序遍历:先看左孩子节点,再看root,最后看右孩子节点 )
题目要求需要先将读入的字符通过先序遍历的方式创建二叉树,再对二叉树进行中序遍历进行输出。我们可以创建一个二叉树建立函数(先序遍历)和一个中序遍历显示函数。我们需要得到每个二叉树节点,都可以往下找其左孩子节点和右孩子节点,可以创建一个结构体,分别存放左孩子节点的地址、右孩子节点的地址、原节点的数值。
(1)二叉树创建函数
题目规定输入数值大小不超过100,可以通过sacnf函数先将数值存入一个101大小的数组中(保守起见,比需求大1格,‘\0’需要占一格)。可以从前到后对数组进行个遍历,对每一个值进行判断。数值为不为‘#’,就创建节点,将数值存入val变量中。再判断数组下一个数值是否为‘#’,如果是就让其父亲节点指向NULL,不创建节点;否则就创建节点,并将数值赋值给该节点的val变量,最后将该节点地址赋给其父亲节点。

为了方便理解,我们看下面的图来捋清楚思路。下面的1、2、3、4、5、6、7分别是先序遍历创建二叉树的步骤,这只是我们眼中的步骤,和题目需要的有所差异。实际上根据题目要求,在第3步后面会判断c节点的左孩子和有孩子有没有数值,没有数值就返回NULL,然后再继续去下一个有数值的节点,反复上述操作。可以看出c节点下面没有数值,所以按题目要求这两个值都是’'#",并给c节点的左孩子和右孩子指针赋值NULL,不创建其左右孩子节点。然后就跳到d节点,循环往复,直道g节点左右都没数值,整棵树都没有可以创建的节点,那么这棵二叉树就创建完成了。
在这里插入图片描述本文用的是递归的方式创建二叉树,先判断一下结束条件,创建二叉树有两种情况,一种是空树(NULL),不需要创建节点;一种有数值,需要创建节点。第一种情况可以作为特殊情况,放在前面判断,是就直接结束返回NULL,不继续后面的操作。第二种作为正常情况处理,创建节点,给节点的val变量赋值,再继续判断左右节点,最后再返回自己节点的地址。这样可以保证每个存在的节点,其左右节点都会被遍历,且都有节点地址。

(2)中序遍历函数
下图为中序遍历,和上面一样,1-7为遍历顺序。
在这里插入图片描述中序遍历函数依旧用递归方式进行遍历。先确定结束条件,当寻找的地址为NULL时结束。所以可以将其作为特殊情况先判断,是就结束,否则就继续正常情况。中序遍历,先左、再root、最后右。那就对应顺序,先判断左节点,再显示root节点,最后判断右节点。如果存在数值就会往左孩子去找,左孩子没有节点,下一个就会显示原节点的数值;如果左孩子有节点,那就会继续往下找。(右孩子也一样,就是顺序不同而已)

#include <stdio.h>
#include <stdlib.h>
struct BinaryTree
{
    struct BinaryTree* left;//指向该节点的左孩子节点的地址
    struct BinaryTree* right;//指向该节点的右孩子节点的地址
    char val;//该节点的数值
};

struct BinaryTree* CreatTree(char* arr, int* pi)//二叉树创建函数
{
    if(arr[(*pi)] == '#')
    {
        (*pi)++;
        return NULL;
    }
    struct BinaryTree* newnode = (struct BinaryTree*)malloc(sizeof(struct BinaryTree));//创建节点
    newnode->val = arr[(*pi)++];
    newnode->left = CreatTree(arr, pi);
    newnode->right = CreatTree(arr, pi);
    return newnode;//返回节点地址
}

void InOrder(struct BinaryTree* root)//中序遍历函数
{
    if(root == NULL)
    {
        return;//无返回值并结束
    }
    InOrder(root->left);
    printf("%c ", root->val);
    InOrder(root->right);
}
int main() {
    char arr[101] = " ";
    scanf("%s", arr);
    int i = 0;
    struct BinaryTree*root = CreatTree(arr, &i);
    InOrder(root);
    return 0;
}

题目链接:https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

如有不当之处,感谢各位大佬指正。

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

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

相关文章

预览ppt时中文乱码

现象&#xff1a;预览ppt时中文乱码 原因&#xff1a;该后端服务部署的主机没有指定中文字体 解决&#xff1a;用root角色在主机目录 /usr/share/fonts 上传Chinese字体文件 1、上传解压后&#xff0c;去应用上测试&#xff0c;发现页面全空白的&#xff0c; 且后台服务日志…

擎创技术流 | ckman教程(3)CKman源码分析部署集群的主要步骤

叮~您有一个新的技术分享已送达&#xff0c;请注意查收~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 哈喽&#xff0c;各位知乎友友们~ckman使用教程分享已经到第3期啦&#xff0c;不知道大家都掌握了没有呢&#xff1f;没有的话也没关系&#xff0c;点击下方链接&#xff0c;一键回…

centos7 + mysql 8 安装confluence7.19.3

一、安装包下载 1、访问下载连接&#xff0c;进行下载最新的安装包 Confluence Server 下载存档 | Atlassian mkdir -p /data/soft cd /data/soft wget https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-7.19.3.tar.gz 2、数据库准备 …

单元测试(jest):理解、安装、使用

一、理解单元测试的重要性 bug发现在开发阶段&#xff0c;成本很低&#xff0c; 如果发现在生产环境&#xff0c;成本很高&#xff0c; 如果是关键时刻&#xff0c;决定人生命运&#xff0c;决定企业发展。 从技术的角度讲&#xff0c;有效的提高代码的健壮性&#xff0c;有效…

GO语言集成开发工具环境JetBrains GoLand 2022

JetBrains GoLand 2022是一款专业的GO语言编程软件。JetBrains GoLand支持编码辅助功能&#xff0c;IDE会分析你的代码&#xff0c;然后在符号之间寻找连接。提供代码提示&#xff0c;快速导航&#xff0c;灵活的错误分析能力以及格式化和重构功能。JetBrains GoLand 2022 强大…

docker安装es+mac安装Kibana工具+es查询语法笔记

一、docker安装es 1、下载镜像 docker pull elasticsearch:7.9.0下载完后&#xff0c;查看镜像 docker images​​ 2、启动镜像 docker network create esnetdocker run -d --name es -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.typesingle-node&…

图解CentOS7集群时钟同步chronyd

文章目录概述图步骤1、修改时区2、安装chrony3、选1台机作为时钟服务器4、其他机器同步时间概述 对于物理机集群&#xff0c;需要使用统一的时间&#xff0c;本文使用时钟同步技术来实现 图 图解 默认的 外部网络的 时钟服务器 在国外&#xff0c;速度较慢 0.centos.pool.n…

(表格固定尾列)bower安装的相关问题

遇到需求固定表格尾列&#xff0c;尾列是操作&#xff08;查看&#xff0c;删除&#xff09;这些 尝试了css&#xff0c;js&#xff0c;jquery&#xff0c;插件&#xff0c;layui&#xff0c;elementui各种都没用 freeze-table&#xff08;一个固定表格插件&#xff09; npm i…

【父母必知】呼吸过敏知多少

“吃完鸡蛋后全吐了&#xff0c;是过敏吗&#xff1f;”“湿疹怎么不经意间又出现了&#xff0c;到底吃了什么”“咳嗽总是不好&#xff0c;都说我们是过敏性咳嗽&#xff0c;对什么过敏&#xff1f;”“小时候&#xff0c;湿疹肠绞痛跑到医院&#xff0c;现在鼻炎哮喘还跑到医…

计算机对字节的七种操作

计算机对字节的处理有七种&#xff1a;复制&#xff0c;左移&#xff0c;右移&#xff0c;非&#xff0c;与&#xff0c;或&#xff0c;异或。本篇将回顾一下这几种操作的具体底层实现 四种常见的门结构 到目前为止&#xff0c;我们已经使用了NAND、AND和NOT门。我们需要定义另…

基于soft-RoCE运行OSU Micro Benchmark

之前的文章描述了如何运行Benchmark&#xff0c;但是那个是基于TCP的。现在想要跑一个基于RoCEv2的结果。虚拟机上没有支持infiniband的网卡&#xff0c;那就用Soft RoCE了。 Soft-RoCE的安装和调试 系统版本信息 adminosu-1:~$ uname -a Linux osu-1 5.11.0-44-generic #48~…

1.1 极限的概念

1.1 极限的概念 1.1.1 数列的极限 引言 在物理实验中&#xff0c;如果涉及到测量&#xff0c;那么误差总是存在的。误差是在正确实验的情况下实验测量值与理论值之间的差值。如果理论是正确的并且使用更精密的实验仪器或改进实验方法&#xff0c;那么测量值就会更加接近理论…

sql server卡慢问题定位和排查

一、数据库服务器资源排查 二、数据库sql性能排查 2.1、查询哪些资源被阻塞了 和 堵进程 1&#xff09;、查询哪些资源被阻塞了&#xff08;spid为阻塞进程id&#xff09; select * from sys.sysprocesses where status suspended 2&#xff09;、查询堵进程…

基于springboot的疫情防控管理系统

1、项目介绍 基于springboot的疫情防控管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;用户管理、隔离地点管理、隔离人员管理、防护用具管理、消毒管理、生活需求管理、体温上报管理、核酸结果管理、配餐管理、物资配送管理、隔离解除管理等 用户&#x…

linux make和makefile

目录linux make和makefilemake小程序进度条linux make和makefile make 会不会写makefifile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefifile定义了一系列…

一文快速学会linux shell 编程基础!!!

文章目录前言一、shell脚本执行的方式1.格式要求2.脚本常用执行方式2.1 . 输入脚本的绝对路径或相对路径进行执行2.2 使用 sh 脚本的方式shell 的注释语法二、shell 变量1.shell变量介绍2.shell 变量的定义定义变量定义变量的规则将命令的返回值赋给变量3.设置环境变量3.位置参…

多功能电力仪表在物联网的应用

安科瑞 华楠 有线多功能电力仪表场景 应用场景 功能&#xff1a; 1.支持全电力参数测量&#xff1b;以及2-31次分次谐波测量&#xff1b;支持双向有功电能计量&#xff0c;支持四套时段表、4个时区、14个日时段、4种费率的电能统计&#xff1b;需量及发生时间统计&#xff1…

智慧党务管理源码,竞赛答题+阅读学习一套系统全搞定

智慧党务源码系统是利用互联网技术实现党建信息资源整合、逐步提升现代化党建知识水平的党务学习答题系统平台。今天万岳科技就来讲一讲如果开发一套智慧党务源码需要满足哪些功能&#xff1f;智慧党务学习答题系统主要功能为&#xff1a; 1、党组织管理&#xff1a;对各级党务…

我参加NVIDIA Sky Hackathon 环境安装(基本系统环境)

我的硬件环境 x86的物理机RTX 3060 12G16G 的 U盘 软件环境 Ubuntu 20.04 LTSssh 命令行输入 apt install ssh 即可 第一个坑&#xff1a; 18.04 的 Ubuntu 系统在安装过程中无法显示&#xff0c; 99% 的场景显示器会黑屏所以 3060 最好使用 Ubuntu 20.04 及以上版本 安装…

SpringMVC ---- SpringMVC的视图

SpringMVC ---- SpringMVC的视图1. ThymeleafView2. 转发视图3. 重定向视图4. 视图控制器view-controllerSpringMVC 中的视图是 View 接口&#xff0c;视图的作用是渲染数据&#xff0c;将模型 Model 中的数据展示给用户 SpringMVC 的视图种类很多&#xff0c;默认有转发视图和…