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. Markdown编辑器——常用语法

    Markdown是什么? 简短来说,他就是一款特别适用于写博客的编辑器.为什么适合呢,因为它特别的方便.以博客园的编辑界面来说,它原本的界面是这样的(有没有一种Word2003的既视感): 但是,当你 ...

  2. [Erlang36]kerl轻松管理安装各种OTP版本

    kerl只有一个目标:让我们在不同的OTP版本间随意切换.他是一个纯Bash项目.简单实用的工作利器! Readme里面用法已说明得非常清楚了.建议按流程来一次. 1.下载 安装(一个bash脚本,根 ...

  3. [Oracle]Oracle部分函数

    1.nvl(a,b) 若a为null,则b 2.to_char(date,'YY-MM-DD') 按格式将date类型转为字符串 to_date('1999/1/1','YY-MM-DD') 将字符串 ...

  4. MaxScript通过.net发送邮件

    Fn SmtpSendMail argSmtpAddress argSenderAddress argSenderPassword argTargetAddress argTitle argMessa ...

  5. django系列5.1--ORM对数据库的操作

    Django---ORM数据库操作(图书管理系统基本实例) 一.基本知识 MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Mo ...

  6. 关闭tomcat端口号

    一. CentOS 关闭tomcat端口号 1. 首先保证liunx下 ps -ef | grep java 2. 会显示如下信息 我使用的是IDEA打包的war包.tomcat是自带的 3. 查看未 ...

  7. XCode7无证书真机调试教程

    转载自http://altair21.com/156.html 前提条件: XCode版本>=7 1. 进入xcode,菜单栏选择xcode –> preferences (快捷键 com ...

  8. TX2 安装v4l

    在TX2上使用v4l2-ctl --all -d /dev/video0查看相机参数时报错: v4l2-ctl :command not found 手动安装: sudo apt-get instal ...

  9. Ubuntu16.04安装视觉SLAM环境(DBow3)

    1.从Github上现在DBow3词袋模型库 git clone https://github.com/rmsalinas/DBow3.git 2.开始安装DBow3库,进入DBow3目录 mkdir ...

  10. allure报告定制(pytest+jenkins)

    环境及安装可查看 pytest+jenkins安装+allure导出报告 要让allure报告更漂亮,更直观,需要在脚本中写入allure特性 一开始allure调用step().story().fe ...