《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历 问题 D: 二叉树遍历

embedded/2025/3/28 14:31:26/
题目描述

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

输入

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

输出

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

样例输入
a#b#cdef#####
a##
样例输出
a b f e d c 
a 

分析:给出的序列是前序遍历序列,可以用栈来保存节点,模拟前序遍历。注意退栈时,如果当前栈顶元素的右孩子已经填充过(不管是‘#’还是字母),就要继续退栈。

#include    <algorithm>
#include     <iostream>
#include      <cstdlib>
#include      <cstring>
#include       <string>
#include       <vector>
#include       <cstdio>
#include        <queue>
#include        <stack>
#include        <ctime>
#include        <cmath>
#include          <map>
#include          <set>
#include<unordered_map>
#define INF 0x3f3f3f3f
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,a) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#a<<"="<<(a)<<endl
#define db5(x,y,z,a,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#a<<"="<<(a)<<", "<<#r<<"="<<(r)<<endl
using namespace std;typedef struct node
{char val;struct node *left,*right;int flag_l,flag_r,flag;//三个标志分别标志左孩子、右孩子、自己是否已经填充
}node;void Free(node *root)
{if(root->left!=NULL)Free(root->left);if(root->right!=NULL)Free(root->right);free(root);return;
}void mid_order(node *root)
{if(root==NULL)return;mid_order(root->left);printf("%c ",root->val);mid_order(root->right);return;
}int main(void)
{#ifdef testfreopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);clock_t start=clock();#endif //testchar pre[1100];while(~scanf("%s",pre)){stack<node*>sta;node *root=(node*)malloc(sizeof(node));root->flag_l=root->flag_r=root->flag=0;root->left=root->right=NULL;sta.push(root);int len=strlen(pre);for(int i=0;i<len;++i){node *temp=sta.top();if(pre[i]!='#')//不为空{if(temp->flag==0)temp->val=pre[i],temp->flag=1;//自己还没填,先填自己else if(temp->flag_l==0)//自己填了,填左子树{node *p=(node*)malloc(sizeof(node));p->val=pre[i];p->flag_l=p->flag_r=0,p->flag=1;p->left=p->right=NULL;temp->flag_l=1,temp->left=p;sta.push(p);//把左孩子进栈,接下来填左子树}else if(temp->flag_r==0)//自己、左孩子都填了,填右子树{node *p=(node*)malloc(sizeof(node));p->val=pre[i];p->flag_l=p->flag_r=0,p->flag=1;p->left=p->right=NULL;temp->flag_r=1,temp->right=p;sta.push(p);//把右孩子进栈,接下来填右子树}}else//为空。自己肯定不为空,因为空节点不会进栈{if(temp->flag_l==0)temp->flag_l=1;//左子树先为空else if(temp->flag_r==0)//左子树已经有了,右子树为空{temp->flag_r=1;//出栈要一直出到右子树还没填的节点while(!sta.empty()&&sta.top()->flag_r==1)sta.pop();}}}mid_order(root);printf("\n");Free(root);}#ifdef testclockid_t end=clock();double endtime=(double)(end-start)/CLOCKS_PER_SEC;printf("\n\n\n\n\n");cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位#endif //testreturn 0;
}


http://www.ppmy.cn/embedded/174000.html

相关文章

浅谈AI落地之-关于数据增广的思考

前言 曾在游戏世界挥洒创意&#xff0c;也曾在前端和后端的浪潮间穿梭&#xff0c;如今&#xff0c;而立的我仰望AI的璀璨星空&#xff0c;心潮澎湃&#xff0c;步履不停&#xff01;愿你我皆乘风破浪&#xff0c;逐梦星辰&#xff01; 数据增广中的mixup&#xff08;Mixup Au…

5.3《凸透镜成像的规律》——先于5.2《生活中的透镜》讲

教会什么:凸透镜成像规律 培养什么:(再说) 课标: (二)运动和相互作用 2.3 声和光 2.3.5探究并了解凸透镜成像的规律。 (四)实验探究 4.2 探究类学生必做实验 4.2.8 探究凸透镜成像的规律。 例8 用蜡烛(或F形光源)、凸透镜、光具座、光屏等,探究凸透镜成像时,像的正…

20250314-vue-Props3

Props 校验 vue组件可以更细致地声明对传入的 props 的校验要求。比如类型声明&#xff0c;如果传入的值不满足类型要求&#xff0c;Vue会在浏览器控制台中抛出警告来提醒使用者。这在开发给其他开发者使用的组件时非常有用。 要声明对 props 的校验&#xff0c;可以向 props…

性能测试之grafana展示jmeter测试指标与主机监控

性能测试之grafana展示jmeter测试指标与主机监控 背景 ​ 公司新的项目准备开展性能测试,之前性能监控主要使用的jmeter的插件jpgc-Transactions per Second 与 jpgc- Response Times Over Time 与 jpgc - Active Threads Over Time等等插件监控性能指标结果,PerfMon Metrics…

华为OD机试 - 仿LISP运算 - 逻辑分析(Java 2023 B卷 200分)

题目描述 LISPQ语言的唯一语法是括号必须配对,形如(OP P1 P2 ...),括号内元素由单个空格分隔。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型。当前OP类型为add/sub/mul/div(全小写),分别代表整数的加减乘除法。简单起见,所有OP参数个数均为…

pytorch小记(九):pytorch中创建指定形状的张量: torch.empty

pytorch小记&#xff08;九&#xff09;&#xff1a;pytorch中创建指定形状的张量: torch.empty 详细解释1. 基本功能2. 语法3. 示例代码示例 1&#xff1a;创建一个 5 的未初始化张量示例 2&#xff1a;创建一个 23 的未初始化张量示例 3&#xff1a;指定数据类型和设备 4. 注…

HTML5 Canvas 的俄罗斯方块游戏开发实践

基于 HTML5 Canvas 的俄罗斯方块游戏开发实践 这里写目录标题 基于 HTML5 Canvas 的俄罗斯方块游戏开发实践项目概述技术栈选择核心功能实现1. 游戏初始化2. 方块设计3. 碰撞检测4. 方块旋转5. 消行处理 性能优化项目难点与解决方案开发经验总结项目收获未来优化方向结语 项目概…

Spring、Spring Boot、Spring Cloud 的区别与联系

1. Spring 框架 定位&#xff1a;轻量级的企业级应用开发框架&#xff0c;核心是 IoC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 核心功能&#xff1a; 依赖注入&#xff08;DI&#xff09;&#xff1a;通过 Autowired、Component 等注解…