问题 N: 二叉树的创建和文本显示

问题 N: 二叉树的创建和文本显示

题目描述
编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
A ST C # # D 10 # G # # F # # #
各结点数据(长度不超过3),用空格分开,其中“#”代表空树。
建立起此二叉树以后,再按要求输出二叉树。

输入
输入由多组测试数据组成。

每组数据包含一行字符串,即二叉树的先序遍历,字符串长度大于0且不超过100。

输出
对于每组数据,显示对应的二叉树,然后再输出一空行。输出形式相当于常规树形左旋90度。见样例。 注意二叉树的每一层缩进为4,每一行行尾没有空格符号。

样例输入 Copy
A ST C # # D 10 # G # # F # # #
4 2 1 # # 3 # # 5 # 6 # #
样例输出 Copy
AFDG10STC65
4321

实现过程

题目内容:

编写一个程序,该程序能够读取一个表示二叉树先序遍历的字符串,并据此创建一棵二叉树。二叉树的节点存储数据,并且每个节点都有指向左子树和右子树的指针。如果先序遍历字符串中的某个位置是空树,使用特殊字符“#”表示。

例如,给定以下先序遍历字符串:

A ST C # # D 10 # G # # F # #

该字符串表示的二叉树应该被如下创建:

  • 根节点是“A”,其左子树是“ST”,右子树是“C”。
  • “ST”的左右子树都不存在(用“#”表示)。
  • “C”的左子树是“D”,右子树是“10”。
  • “D”和“10”的左右子树都不存在。
  • “C”的右子树是“G”,但它的左右子树不存在。
  • “A”的右子树是“F”,但它的左右子树也都不存在。

题目目的:

  1. 理解二叉树的结构:掌握二叉树的基本概念,包括节点、先序遍历、左子树和右子树。

  2. 学习先序遍历的特点:在先序遍历中,第一个节点是根节点,紧接着是左子树的遍历,最后是右子树的遍历。

  3. 实现字符串到二叉树的转换:通过解析先序遍历字符串,学会如何构建相应的二叉树数据结构。

  4. 掌握递归思想:在构建二叉树和遍历输出二叉树时,使用递归方法解决问题。

  5. 提高编程能力:通过实际编写代码,提高编程技巧,特别是在处理指针和动态数据结构时。

  6. 锻炼算法实现能力:实现从字符串到树结构的转换,需要设计和实现有效的算法。

  7. 增强空间想象能力:通过文本形式输出二叉树,增强对树结构空间布局的理解。

  8. 学习数据结构的应用:了解如何将理论知识应用于实际问题,例如使用二叉树解决实际问题。

样例输出格式:

程序应该能够根据输入的先序遍历字符串,以文本形式输出对应的二叉树结构。输出格式应类似于:

    A/ \ST  C/ \D 10/G/
F

每一层的缩进表示树的层次结构,每个节点后没有空格,且每个节点正确地与其子节点对齐。

注意事项:

  • 输入字符串中的节点数据长度不超过3,且节点数据由字母和数字组成。
  • 输入字符串中的“#”代表空树,即没有子节点。
  • 输出格式要符合题目要求,特别是缩进和对齐。

实现一个简单的文本界面下的二叉树创建和遍历程序。
下面是对代码的详细解析:

  1. 头文件和命名空间

    • 包含 <bits/stdc++.h> 头文件,它包含了标准库中的大部分内容。
    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  2. 全局变量

    • depth 用于记录当前的层级深度。
    • judge 用于判断输入是否结束,并跳出循环。
  3. 结构体定义

    • tr 结构体定义了二叉树的节点,包含一个 string s 存储节点数据,以及两个指向左右子节点的指针 LCRC
  4. 递归创建节点

    • Creattr 函数用于递归创建二叉树的节点。
    • 读取节点数据,如果输入的是 # 表示结束,否则递归创建左子树和右子树。
  5. 递归创建树

    • CreatTree 函数用于递归创建整个二叉树。
    • 读取根节点数据,如果读取失败(文件结束或空字符串),设置 judge 为 1 并返回 0 表示结束。
  6. 递归输出节点

    • Outtr 函数用于递归输出二叉树的节点。
    • 首先递归输出右子树,然后输出当前节点(带缩进表示层级),最后递归输出左子树。
  7. 输出树

    • OutTree 函数调用 Outtr 函数输出二叉树。
  8. 主函数 main

    • 使用 while(1) 创建无限循环,直到 judge 被设置为 1 时跳出。
    • 创建 Tree 指针,调用 CreatTree 函数创建二叉树。
    • 如果 judge 为 1,使用 break 跳出循环。
    • 调用 OutTree 函数输出二叉树,并输出一个空行。
  9. 程序结束

    • 返回 0,表示程序正常结束。

代码逻辑分析

  • 这段代码使用递归方法来创建和遍历二叉树。
  • 使用 # 作为输入结束的标志,允许用户输入空格跳过节点的创建。

潜在问题

  • 使用 cin 直接读取字符串可能不是最佳选择,特别是在处理空格和特殊字符时。
  • 代码没有释放动态分配的内存,可能导致内存泄漏。

改进建议

  • 考虑使用 getline(cin, m->s) 来读取包含空格的字符串。
  • 在程序结束时,添加代码来释放所有动态分配的内存。
  • 可以考虑使用异常处理来管理输入错误和程序错误。
  • 为了提高代码的健壮性,可以添加对输入有效性的检查。

部分实现

存储节点数据

typedef struct tr{string s;struct tr *LC;struct tr *RC;
}tr,*Tr;

2.递归创建二叉树的节点

void Creattr(Tr &m){//建立节点 m=new tr;cin>>m->s;if(m->s[0]=='#');else {Creattr(m->LC);Creattr(m->RC);}
}

递归创建整个二叉树

int CreatTree(Tr &Tr1){//建立树 Tr1=new tr;cin>>Tr1->s;if(!(Tr1->s[0])){judge=1;return 0; }Creattr(Tr1->LC);Creattr(Tr1->RC);return 1;
}

递归输出二叉树的节点

void Outtr(Tr n){//输出节点 depth++;if(n->s[0]=='#');else {Outtr(n->RC);for(int i=0;i<depth;i++)printf("    ");cout<<n->s<<endl;Outtr(n->LC);}
depth--;
}

调用 Outtr 函数输出二叉树

void OutTree(Tr Tr2){//输出树 Outtr(Tr2->RC);cout<<Tr2->s<<endl;Outtr(Tr2->LC);
}

AC代码

#include<bits/stdc++.h>
using namespace std;
int depth=0;int judge=0;
//depth记录当前层数,判断空格的输入,judge判断输入是否结束,跳出循环 
typedef struct tr{string s;struct tr *LC;struct tr *RC;
}tr,*Tr;
void Creattr(Tr &m){//建立节点 m=new tr;cin>>m->s;if(m->s[0]=='#');else {Creattr(m->LC);Creattr(m->RC);}
}
int CreatTree(Tr &Tr1){//建立树 Tr1=new tr;cin>>Tr1->s;if(!(Tr1->s[0])){judge=1;return 0; }Creattr(Tr1->LC);Creattr(Tr1->RC);return 1;
}
void Outtr(Tr n){//输出节点 depth++;if(n->s[0]=='#');else {Outtr(n->RC);for(int i=0;i<depth;i++)printf("    ");cout<<n->s<<endl;Outtr(n->LC);}
depth--;
}
void OutTree(Tr Tr2){//输出树 Outtr(Tr2->RC);cout<<Tr2->s<<endl;Outtr(Tr2->LC);
}
int main(){
while(1){Tr Tree;CreatTree(Tree);if(judge==1)break;OutTree(Tree);cout<<endl;
}return 0;
}

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

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

相关文章

数据结构实训:表达式求值器(非常详细)

表达式求值器 问题描述&#xff1a; 设计一个表达式求值器&#xff0c;能够解析和计算由数字、运算符和括号组成的算术表达式。要求实现基本的四则运算&#xff0c;如加、减、乘、除&#xff0c;并处理运算符的优先级和括号。 设计要点&#xff1a; 1. 使用栈作为数据结构来处…

ElementUI组件

目录 1、安装ElementUI 2、在main.js文件中加入 3、使用组件 终端运行&#xff1a; Element&#xff0c;一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库. 1、安装ElementUI 控制台输入 npm i element-ui -S 2、在main.js文件中加入 import ElementUI from…

老司机开发技巧,如何扩展三方包功能

前言 最近碰上有个业务&#xff0c;查询的sql如下&#xff1a; sql 复制代码 select * from table where (sku_id,batch_no) in ((#{skuId},#{batchNo}),...); 本来也没什么&#xff0c;很简单常见的一种sql。 问题是我们使用的是mybatis-plus&#xff0c;然后写的时候有没…

【智能制造-5】数采和电机

既然可以采集PLC的数据&#xff0c;为什么要采集电机的数据&#xff1f; 采集PLC&#xff08;可编程逻辑控制器&#xff09;的数据和采集电机的数据是两个不同的概念和目的。 PLC是用于控制和监控工业自动化过程的设备&#xff0c;它可以接收传感器的输入信号并根据预设的逻辑…

多线程软件不响应处理

多线程的问题,基本上由于写法不规范造成的问题,从而影响软件正常运行,或时不时出现软件不响应,但是其它CPU,内存保存不变的情况. 出现这样的情况,多半是软件运行时死锁或多个线程相互等待,从而引起的软件未响应的情况发生. 解决办法: 1.while,do while循环增加延时时间Sleep…

重庆交通大学24计算机考研数据速览,专硕第二年招生,复试线321分!

重庆交通大学&#xff08;Chongqing Jiaotong University&#xff0c;CQJTU&#xff09;&#xff0c;是由重庆市人民政府和中华人民共和国交通运输部共建的一所交通特色、以工为主的多科性大学&#xff0c;入选“中西部高校基础能力建设工程”、“卓越工程师教育培养计划”、国…

企业级堡垒机JumpServer

文章目录 JumpServer是什么生产应用场景 Docker安装JumpServer1.Docker安装2.MySQL服务安装3.Redis服务安装4.key生成5.JumpServer安装6.登录验证 系统设置邮箱服务器用户和用户组创建系统审计员资产管理用户创建资产节点资产授权查看用户的资产监控仪表盘 命令过滤器创建命令过…

Model3C芯片方案--86彩屏中控面板Modbus协议说明

一、概述 Model3C芯片是一款基于RISC-V的高性能、国产自主、工业级高清显示与智能控制MCU&#xff0c;配备强大的2D图形加速处理器、PNG/JPEG解码引擎&#xff0c;并支持工业宽温。基于Model3C芯片的86彩屏中控面板&#xff0c;通过集成Modbus协议&#xff0c;实现了与多种控制…

前端存储都有哪些

cookie 、sessionStorage、localStorange、http缓存 、indexDB cookie 由服务器设置&#xff0c;在客户端存储&#xff0c;然后每次发起同源请求时&#xff0c;发送给服务器端。cookie最多能存储4K数据&#xff0c;它的生存时间由expires属性指定&#xff0c;并且cookie只能被…

涨点超强!图像特征提取最新方法!性能效率快到飞起

在图像处理领域&#xff0c;有一个非常关键的步骤&#xff1a;图像特征提取。它能给我们提供一种高效、准确且灵活的方式来描述和分析图像内容。 通过降低图像数据的维度&#xff0c;去除冗余和噪声信息&#xff0c;图像特征提取不但简化了后续处理过程&#xff0c;还能提高算…

ffmpeg使用mjpeg把yuvj420p编码为jpg图像

version #define LIBAVUTIL_VERSION_MAJOR 58 #define LIBAVUTIL_VERSION_MINOR 12 #define LIBAVUTIL_VERSION_MICRO 100 note 1. 通过*.jpg推测时&#xff0c;out_fmt为image2&#xff0c;打开*.jpg文件时&#xff0c;in_fmt为image2 但是out_fmt为image2时&#xff…

web项目打包成可以离线跑的exe软件

目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时&#xff0c;我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标&#xff0c;其中 pywebview 是一个轻量级的库&#xff0c;它允许我们…

滑动窗口算法——部分OJ题详解

目录 关于滑动窗口 部分OJ题详解 209.长度最小的子数组 3.无重复字符的最长字串 1004.最大连续1的个数Ⅲ 1658.将x减到0的最小操作数 904.水果成篮 438.找到字符串中所有字母异位词 30.串联所有单词的子串 76.最小覆盖子串 关于滑动窗口 其实滑动窗口也是通过双指针…

存储引擎MyISAM和InnoDB

目录 一、存储引擎概述 1.存储引擎概念 2.存储引擎分类 3.选择存储引擎的原则 二、InnoDB 存储引擎 三、MyISAM 存储引擎 四、实验操作 一、存储引擎概述 1.存储引擎概念 数据库存储引擎是数据库底层软件组件&#xff0c;数据库管理系统使用数据库引擎进行创建&#x…

Spring Boot中如何处理异步任务

Spring Boot中如何处理异步任务 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用中如何处理异步任务&#xff0c;以提升系统的性…

Nuxt 的异步数据处理(八)

Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 的方法&#xff0c;使得我们可以在设置组件的数据之前能异步获取或处理数据。 asyncData 方法 Nuxt.js 提供了几种不同的方法来使用 asyncData 方法&#xff0c;你可以选择自己熟悉的一种来用&#xff1a; 返回一个…

CMS垃圾回收过程中重新标记阶段为什么不能清理浮动垃圾

因为在并发标记时&#xff0c;因为是 GC 和用户线程是并发执行的&#xff0c;可能导致一部分已经标记为 从 GC Roots 不可达 的对象&#xff0c;若该对象在用户线程的修改下又可达了&#xff0c;Remark 的作用就是将这部分对象又标记为 可达对象&#xff08;漏标&#xff09;。…

Double 4 VR虚拟情景智能互动系统在小语种专业课堂上的应用

随着科技的进步&#xff0c;越来越多的教育机构开始尝试使用虚拟现实技术来提高教学效果。Double 4 VR虚拟情景智能互动系统就是这样一款能够为小语种专业课堂带来革新性体验的教学工具。 一、模拟真实环境&#xff0c;增强学习体验 系统通过高度仿真的虚拟环境&#xff0c;为学…

Git(涵盖GitHub\Gitee码云\GitLab)

Git(涵盖GitHub\Gitee码云\GitLab) 文章目录 Git(涵盖GitHub\Gitee码云\GitLab)课程介绍Git概述官网介绍版本控制介绍两种版本控制工具集中式版本控制工具分布式版本控制工具 Git工作机制代码托管中心 Git安装和客户端的使用Git常用命令设置用户签名初始化本地库查看本地库状态…

C++——string类用法指南

一、前言 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍…