03-树3 Tree Traversals Again(浙大数据结构PTA习题)

03-树3 Tree Traversals Again        分数 25        作者 陈越

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


                                                                        Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

Output Specification:

For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop

Sample Output:

3 4 2 6 5 1

代码长度限制:16 KB        时间限制:400 ms        内存限制:64 MB

题目解析:

本质是根据一棵树的先序遍历结果和中序遍历结果,求解这棵树的后序遍历结果。

在树的遍历中,知中序和先序可求唯一后序;知中序和后序可求唯一先序;知先序和后序不可求唯一中序。

关键点1:根据输入获得先序遍历结果和中序遍历结果

关键点2:根据先序和中序遍历结果输出后序遍历结果

下面将演示建树和不建树两种情况

代码展示:

不建树的情况

// 根据先序遍历与中序遍历求后序遍历# include<stdio.h>
# include<string.h>
# define MAXSIZE 5void Solve(int preL, int inL, int postL, int n, int pre[], int in[], int post[]);int main(){// 一共有多少个结点 int N;scanf("%d",&N);// 创建一个堆栈int Stack[N];int Rear = -1;// 分别创建前、中、后序遍历的结果数组int Pre[N],In[N],Post[N];int PreRear = -1;// count作为弹出元素的计数int num, count = 0;while(count!=N){char handle[MAXSIZE];scanf("%s",handle);if(!strcmp(handle,"Push")){// 接受一个数字并压入栈scanf("%d",&num);Stack[++Rear] = num; // 前序遍历数组记录Pre[++PreRear] = num; }else{// 出栈并在中序遍历中进行记录 num = Stack[Rear--];In[count++] = num;}} // 有了前序与中序遍历结果,接下来通过递归函数求后序遍历结果 Solve(0,0,0,N,Pre,In,Post);int i;for(i=0;i<N;i++){if(i!=N-1)printf("%d ",Post[i]);else printf("%d",Post[i]);}
} void Solve(int preL, int inL, int postL, int n, int pre[], int in[], int post[]){if(n==0)return;if(n==1){post[postL] = pre[preL];return;}// 先序的第一个放在给定后序的最后一个 int root = pre[preL];post[postL+n-1] = root;// 找出左子树的范围 int i;for(i=0;i<n;i++){if(in[inL+i]==root)break;}// 左子树要处理的的结点数 int L = i;// 右子树要处理的结点数 int R = n-L-1;// 递归处理 Solve(preL+1, inL, postL,L,pre,in,post);Solve(preL+L+1,inL+L+1,postL+L,R,pre,in,post);return; 
}

建树的情况:

# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# define MAXNODE 30
# define MAXLENGTH 5typedef struct TreeNode* Tree;
struct TreeNode{int data;Tree left;Tree right;
}; void PostOrder(Tree root,int data);
void CreateTree(int left1,int right1,int left2,int right2,int Pre[],int In[], Tree root);int main(){// 创建一个堆栈int Stack[MAXNODE];int SHead = -1; // 接收结点个数 int N;scanf("%d",&N);getchar();// 分别创建一个用来记录先序和中序遍历结果的数组int PreArray[N],InArray[N];int PreHead=-1, InHead=-1;// 接收操作输入,因为有出入栈,因此共有2*N次操作 int i,num;char* str = (char*)malloc(sizeof(char)*MAXLENGTH);for(i=0;i<2*N;i++){scanf("%s",str);if(strcmp(str,"Push")==0){// 入栈scanf("%d",&num);getchar();Stack[++SHead] = num;// 记录先序PreArray[++PreHead] = num; }else{// 出栈num = Stack[SHead--];// 记录中序InArray[++InHead] = num; }}// 创建根结点Tree root = (Tree)malloc(sizeof(struct TreeNode));root->data = PreArray[0];root->left = NULL;root->right = NULL;// 构建树CreateTree(0,N-1,0,N-1,PreArray,InArray,root);// 后序输出遍历结果,为了格式化输出因此传入根结点的值作为判读依据 PostOrder(root,root->data); return 0; 
}// 递归后序遍历树
void PostOrder(Tree root,int data){if(root){PostOrder(root->left,data);PostOrder(root->right,data);if(root->data == data)printf("%d",root->data);else printf("%d ",root->data);}return;
} // 根据先序和后序构建一棵树;left1与right1表示先序序列的范围;left2与right2表示后序序列的范围
void CreateTree(int left1,int right1,int left2,int right2,int Pre[],int In[], Tree root){// 首先找到根结点在中序中的位置int i,index;for(i=left2;i<=right2;i++){if(root->data == In[i]){index = i;break;}} // 如果根结点有左孩子 if(index!=left2){// 创建一个左孩子结点Tree left_son = (Tree)malloc(sizeof(struct TreeNode));left_son->data = Pre[left1+1];left_son->left = NULL;left_son->right = NULL;root->left = left_son;// 递归构建这个左孩子结点CreateTree(left1+1,index-left2+left1,left2,index-1,Pre,In,left_son); }// 如果根结点有右孩子if(index!=right2){Tree right_son = (Tree)malloc(sizeof(struct TreeNode));right_son->data = Pre[index-left2+left1+1];right_son->left = NULL;right_son->right = NULL;root->right = right_son;// 递归构建这个右孩子结点CreateTree(index-left2+left1+1,right1,index+1,right2,Pre,In,right_son); } return;
} 

运行结果:

两种情况均可通过测试点

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

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

相关文章

C++ 变量类型思维导图梳理

目前了解了前端、后端&#xff0c;准备再学习一门稍微底层的语言&#xff0c;整好自己年龄也比较大了&#xff0c;学个C语言&#xff0c;等以后哪天找不到前后端的工作了&#xff0c;就去做个少儿编程老师&#xff0c;为切换赛道做准备。 1、数据类型 定义&#xff1a;给变量…

LeetCode739:每日温度

题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 解题思想 使用单…

数字化转型对企业来说意味着什么?

数字化转型是当今社会不可避免的趋势&#xff0c;它的发展其实是多方面因素影响导致的。首先&#xff0c;随着科技的迅速发展&#xff0c;人们对于信息获取和处理的需求越来越强烈&#xff0c;这促使了各行各业都要朝着数字化方向发展。其次&#xff0c;全球化的潮流让企业需要…

【Qt秘籍】[006]-Qt 的 Hello World程序-编程第一步

"Hello,World!" 中文意思是“你好&#xff0c;世界”。 因为 The C Programming Language 中使用它做为第一个演示程序&#xff0c;后来很多程序员在学习编程或进行设备调试时延续了这一习惯。 下面&#xff0c;我们也将演示Qt中的"Hello World!" 我们先创…

【揭秘】如何借助聚道云软件连接器,实现差旅管理新飞跃!

导语&#xff1a;在当今竞争激烈的市场环境下&#xff0c;高效的差旅管理已成为企业节省成本、提升员工满意度的关键。今天&#xff0c;我们将带您看看如何通过聚道云软件连接器将易快报与阿里商旅成功对接&#xff0c;实现了差旅申请单的同步等需求&#xff0c;为企业管理带来…

Java实现数据结构---数组

文章目录 概念存储原理数组的操作完整代码 概念 数组是&#xff08;Array&#xff09;是有限个相同类型的变量所组成的有序集合&#xff0c;数组中的每一个变量为称为元素。数组是最简单、最常用的数据结构。 数组下标从零开始。 存储原理 数组用一组连续的内存空间来存储一…

1. tomcat

tomcat 一、tomcat1、作用2、安装tomcat2.1 官方地址2.2 安装jdk2.3 安装tomcat2.4 tomcat相关文件2.5 启动2.6 测试部署java项目2.7 设置开机自启动 二、部署java项目流程1、拉取代码2、安装maven编译工具3、修改maven仓库地址4、部署项目运行环境5、编译项目6、部署项目7、通…

文章《Causal Inference for Knowledge Graph based Recommendation》阅读

文章《Causal Inference for Knowledge Graph based Recommendation》阅读 论文概况及动机&#xff08;Introduction&#xff09;问题形式化方法论Causal Intervention (C1)Model ImplementationU()f()协同过滤部分模型优化 Causal Inference &#xff08;C2&#xff09; Exper…

Kafka生产者消息异步发送并返回发送信息api编写教程

1.引入依赖&#xff08;pox.xml文件&#xff09; <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…

SQL入门详细教程

一、什么是SQL&#xff1f; SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于访问和操作数据库的标准语言。它用于查询、插入、更新和删除数据库中的数据&#xff0c;并且能够创建和修改数据库结构&#xff08;例如表、视图、索引等…

Python登录漏洞复现

Python登录漏洞复现 3.1 环境准备 1&#xff09;升级pip pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple2&#xff09;安装ddddocr图形识别库 pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple3&#xff09;安装requests网络请求…

伦敦金1手指的是什么?

就算没有进行过伦敦金投资&#xff0c;甚至是没有做过任何金融产品投资的朋友&#xff0c;相信也听过别人做交易决定&#xff0c;他们都是1手两手那样头买入。有些朋友就好奇了&#xff0c;这伦敦金1手指的是什么意思&#xff1f;下面我们就来讨论一下。 首先&#xff0c;如果我…

CDH6.3.2集成Flink1.12.2

一、Linux下载httpd服务并开启 yum install y httpd systemctl start httpd systemctl enable httpd 二、获取已制作好的安装包 flink-1.12.2-bin-scala_2.11.tar ​ FLINK_ON_YARN-1.12.2.jar ​ flink-shaded-hadoop-2-uber-3.0.0-cdh6.3.2-10.0.jar 三、集成CM 1.上传编…

ERV-Net:一种用于脑肿瘤分割的高效3D残差神经网络| 文献速递-深度学习肿瘤自动分割

Title 题目 ERV-Net: An efficient 3D residual neural network for brain tumor segmentation ERV-Net&#xff1a;一种用于脑肿瘤分割的高效3D残差神经网络 01 文献速递介绍 脑肿瘤在全球范围内是致命的&#xff0c;与其他类型的肿瘤相比。胶质瘤是最具侵略性的脑肿瘤类…

java opcua实现数据点位事件订阅

前言 之前写了一篇文章《Java实现OPC UA断连重连和数据监听》 里面有代码实现对点位订阅的实现,但是有些x需求下这么写感觉不太好,今天又更新一种订阅的实现方式,根据不同的场景需求选择更合适的方案。 教程 依赖 首先在maven项目种引入opc依赖 <dependency><g…

数据挖掘与机器学习——聚类算法

目录 无监督学习 聚类算法 概念&#xff1a; 功能&#xff1a; 应用场景&#xff1a; 评判标准&#xff1a; 划分聚类&#xff1a; K-means聚类 逻辑实现&#xff1a; 聚类方式 问题&#xff1a; 解决&#xff1a; 可能存在的问题&#xff1a; 1.初始值对K-means聚…

Ubuntu 22.04, 如何让VSCode中的cmakelist高亮显示

安装cmake插件即可。 CMakeLists.txt is not syntax highlighted Issue #534 microsoft/vscode-cmake-tools GitHub

CANOE制造dll文件,以及应用dll文件

1、使用canoe自带的capl dll 2、然后使用Visual Studio 2022 打开项目 3、项目打开后修改下项目属性 4、修改capldll.cpp文件 4.1 添加的内容 void CAPLEXPORT far CAPLPASCAL appSum(long i, long j, long* s){*s i j;} {"sum", (CAPL_FARCALL)appSum, "…

python前端streamlit模型部署

简单介绍使用前端streamlit框架快速部署本地模型&#xff1a; 1、模型训练&#xff1a; import pandas as pd # 流程整合 from sklearn.pipeline import make_pipeline, Pipeline # 数据处理 from sklearn.impute import SimpleImputer from sklearn.preprocessing import Min…

01 - Maven入门安装

目录 1、软件下载地址 2、安装的版本 3、安装的条件 4、软件的结构 5、Maven环境配置 5.1、配置MAVEN_HOME 5.2、配置Path 5.3、命令测试&#xff08;cmd窗口&#xff09; 6、Maven的功能配置 6.1、配置本地仓库地址 6.2、配置国内阿里镜像 6.3、配置jdk8版本项目构…