浙大模拟(1)问题 C: 还原二叉树
2017-03-12 12:04
169 查看
题目描述
给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。输入
每个输入文件中一组数据。第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。
输出
输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。样例输入
73 5 4 2 6 7 1
2 5 3 6 4 7 1
样例输出
3 5 2 4 6 7 12 5 6 1 7 4 3
#include<stdio.h> #include<stdlib.h> using namespace std; int post[32]; int level[32]; int pre[32]; int in[32]; int n; typedef struct BiTNode{ int key; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; BiTree creatTree(BiTree &T,int l,int r){ if(l>r) return NULL; int mid; bool flag = false; for(int i=1;i<=n;i++ ){ if(flag == false){ for(int j=l;j<=r;j++){ if(level[i]==in[j]){ mid = j; flag=true; break; } } } } T = (BiTree)malloc(sizeof(BiTNode)); T->key = in[mid]; // printf("mid=%d\n",mid); T->lchild = creatTree(T->lchild,l,mid-1); T->rchild = creatTree(T->rchild,mid+1,r); return T; } int flag; void preOrder(BiTree T){ if(T){ if(flag == false){ printf("%d",T->key); flag = true; } else{ printf(" %d",T->key); } preOrder(T->lchild); preOrder(T->rchild); } } void postOrder(BiTree T){ if(T){ postOrder(T->lchild); postOrder(T->rchild); if(flag == false){ printf("%d",T->key); flag = true; } else{ printf(" %d",T->key); } } } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++){ scanf("%d",&level[i]); } for(int i=1;i<=n;i++){ scanf("%d",&in[i]); } BiTree T ; T = creatTree(T,1,n); flag = false; preOrder(T); printf("\n"); flag = false; postOrder(T); } return 0; }
相关文章推荐
- 浙大PAT 2-09. 装箱问题模拟 (解题思路)
- PAT 1020 已知中序后序,还原二叉树 (二叉树遍历问题)
- SQL Server还原问题总结
- 一个IQ问题的C++模拟
- 开发键盘过滤驱动实现模拟按键过程中遇到的问题
- sql server 2005笔记——将数据库从2000还原到2005需要注意的两个问题
- 浙大acm问题1003
- Java: 简单模拟多线程访问同样变量导致的问题
- 用分冶策略解决关于二叉树的几个问题
- 刚注册,问个问题,在asp.net里有个xml文档以MemoryStream存在资源文件中,现在我如何把他读出来,还原成xml文档。
- C#模拟死锁问题
- 用二叉树的中序和前序还原二叉树
- SQL常见问题:如何利用日志还原SQL数据库?
- MS SQLServer2000中在还原备份文件时出现的奇怪问题.
- C#模拟读者写者问题
- SWMM引擎之二——在读SWMM模拟结果时应注意的问题
- 切记数据库还原问题
- 多线程模拟哲学家就餐问题
- 开发键盘过滤驱动实现模拟按键过程中遇到的问题___续
- SQL Server还原问题总结