Tree Traversals

  Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

  Each input file contains one test case. For each case, the first line gives a positive integer N (≤), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

  For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:

4 1 6 3 5 7 2

题目解析
  本题第一行给出二叉树的结点数量n,之后第二行给出二叉树的后序遍历,第三行给出二叉树的中序遍历,要求输出二叉树的层序遍历。(保证树中的每个结点数据都不同)

  后序遍历中最后一个元素便是当前树的根结点,在中序遍历中找到根结点对应的值,其左侧便是左子树的中序遍历,在知道左子树中序遍历后可以根据结点数量在后续遍历中找到左子树的后续遍历,确定了左子树与根结点后剩下的便是右子树信息了,以此类推可以得到整棵二叉树。

  建立二叉树后使用广搜,由于广搜二叉树维护队列时,每次出队一个结点并将其对应的左孩子与右孩子入队,这就是层序遍历。

  AC代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int postorder[maxn]; //储存后续遍历
int inorder[maxn]; //储存中序遍历
struct node{ //二叉树结点信息
int data;
node *lchild;
node *rchild;
node(int tdata){ //构造函数
data = tdata;
lchild = NULL;
rchild = NULL;
}
};
node *create(int postL, int postR, int inL, int inR){
//由于要递归建树我们并不需要将每个树的左子树右子树的后序遍历与中序遍历储存下来
//只需要在原始postorder与inorder数组中标记出其位置即可
//postL与postR表示当前后续遍历的左右两端,inL与inR表示当前中序遍历的左右两端
if(postL > postR) //如果后续遍历左端位置大于右端位置,证明当前正在建立的树为空树
return NULL;
node *root = new node(postorder[postR]); //建立根结点,权值为postorder[postR]左右子树都为空
int i;
for(i = inL; inorder[i] != postorder[postR]; i++); //在中序遍历中找到根结点
int lenl = i - inL; //记录左子树长度
root->lchild = create(postL, postL + lenl - , inL, inL + lenl - );
//建立左子树
root->rchild = create(postL + lenl, postR - , inL + lenl + , inR);
//建立右子树
return root;
}
int n; //n记录结点数量
void levelorder(node *root){ //层序遍历
if(root == NULL)
return;
queue<node*> Q;
Q.push(root); //根结点入队
int cnt = ; //记录当前已经输出了几个数,用于之后判断是否输出空格
while(!Q.empty()){
cnt++;
node *top = Q.front();
Q.pop();
printf("%d", top->data);//输出结点权值
if(cnt != n)
printf(" ");
if(top->lchild != NULL) //左儿子入队
Q.push(top->lchild);
if(top->rchild != NULL)//右儿子入队
Q.push(top->rchild);
}
}
int main(){ scanf("%d", &n); //输入结点数量
for(int i = ; i < n; i++)
scanf("%d", &postorder[i]); //输入后序遍历
for(int i = ; i < n; i++)
scanf("%d", &inorder[i]); //输入中序遍历
node *root = create(, n - , , n - ); //建树
levelorder(root); //输出层序遍历
return ;
}
 

PTA (Advanced Level) 1020 Tree Traversals的更多相关文章

  1. PAT (Advanced Level) 1020. Tree Traversals (25)

    递归建树,然后BFS一下 #include<iostream> #include<cstring> #include<cmath> #include<algo ...

  2. PAT (Advanced Level) 1086. Tree Traversals Again (25)

    入栈顺序为先序遍历,出栈顺序为中序遍历. #include<cstdio> #include<cstring> #include<cmath> #include&l ...

  3. PAT Advanced 1020 Tree Traversals (25 分)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  4. 【PAT】1020 Tree Traversals (25)(25 分)

    1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...

  5. PAT 1020 Tree Traversals[二叉树遍历]

    1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...

  6. PAT 甲级 1020 Tree Traversals (二叉树遍历)

    1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  7. PAT 1020. Tree Traversals

    PAT 1020. Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. ...

  8. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  9. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

随机推荐

  1. c#复习提纲

    c#零碎整理 注:本文中大部分图片来自老师的PPT,感谢邵老师!文中所有内容为自己按照PPT整理,欢迎指正! 标识符 标识符(类名.变量名.方法名.表空间名等) 大小写敏感 正则表达式  小括号(组合 ...

  2. 记开发个人图书收藏清单小程序开发(六)Web开发

    Web页面开发暂时是没有问题了,现在开始接上Ptager.BL的DB部分. 首先需要初始化用户和书房信息.因为还没有给其他多余的设计,所以暂时只有个人昵称和书房名称. 添加 Init Razor Pa ...

  3. PL/SQL控制语句(二、循环控制语句)

    循环允许重复执行代码直到循环条件匹配,PL/SQL中循环主要有LOOP语句和EXIT语句两种,这两种语句相辅相成,一起组成了PL/SQL的循环结构.在PL/SQL中,循环分为四大类,本文将会讲解其中的 ...

  4. 【Oracle 12c】最新CUUG OCP-071考试题库(55题)

    55.(13-3) choose the best answer: Which statement is true regarding the SESSION_PRIVS dictionary vie ...

  5. 微信小程序转发商品的详情页 + 转发功能(传参)

    1.微信小程序转发传参,利用的还是onShareAppMessageapi 2.利用的还有json转换 JSON 是用于存储和传输数据的格式. JSON 通常用于服务端向网页传递数据 函数 描述JSO ...

  6. 一篇文章搞懂Linux安全!

    Linux是开放源代码的免费正版软件,同时也是因为较之微软的Windows NT网络操作系统而言,Linux系统具有更好的稳定性.效率性和安全性. 在Internet/Intranet的大量应用中,网 ...

  7. rpm 卸载

    卸载:python-urlgrabber-3.9.1-9.el6.noarch rpm -e python-urlgrabber-3.9.1-9.el6.noarch

  8. C++多线程编程二

    1. 死锁与解锁: #include <iostream> #include <thread> #include <mutex> using namespace s ...

  9. Android服务重启

    现在有这样的需求,防止自己的app被其他的应用程序(比如qq手机管家)杀死,该怎么实现呢.我们知道app都是运行在进程中的,android是怎样管理这些进程的呢.要想app不被杀死,只要做到进程不被结 ...

  10. Linux RPM和YUM

    rpm包的管理:sealed 介绍: 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件. RPM是RedHat Package Manager(Re ...