PTA (Advanced Level) 1020 Tree Traversals
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的更多相关文章
- PAT (Advanced Level) 1020. Tree Traversals (25)
递归建树,然后BFS一下 #include<iostream> #include<cstring> #include<cmath> #include<algo ...
- PAT (Advanced Level) 1086. Tree Traversals Again (25)
入栈顺序为先序遍历,出栈顺序为中序遍历. #include<cstdio> #include<cstring> #include<cmath> #include&l ...
- PAT Advanced 1020 Tree Traversals (25 分)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- 【PAT】1020 Tree Traversals (25)(25 分)
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- PAT 1020 Tree Traversals[二叉树遍历]
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- PAT 甲级 1020 Tree Traversals (二叉树遍历)
1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- PAT 1020. Tree Traversals
PAT 1020. Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
随机推荐
- 新手上路,django学习笔记(1) 环境部署
很多年没写代码了,以前学的C#,用ASP.NET,但是最近几年没落了,JAVA在崛起,最近感觉Python比较火,总是在各种技术场合听到Python,或者身边的朋友在讨论Python,所以突然想学习一 ...
- npm 安装less
npm install less less-loader --save 在style加上lang="less" 就可以直接用了
- Django博客项目思路整理
首先明确一点,我目前学习Django是为了做一个博客,那么以博客为目标进行实践的话,按照Django的MTV模型的顺序来思考的话,要考虑如下几个事情: (Models) 1.在博客里的各种数据模型: ...
- WEB文本框提示
<input type="text" placeholder="文本框提示语" name="version_no"/>
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS M ...
- sharepoint database 操作
select *from [dbo].[AllLists] where tp_Title='Pages' and tp_WebId='90511126-E1FE-4E4C-8DDF-74DFC89E8 ...
- python网络编程--协程
1.协程 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.. 需要强调的是: 1. pyt ...
- Exp5 MSF基础应用 20164323段钊阳
网络对抗技术 20164323 Exp5 MSF基础应用 靶机 ip:192.168.1.229 kali ip:192.168.1.216 exploit选取 主动攻击:ms17_010_psexe ...
- Learning Rich Features from RGB-D Images for Object Detection and Segmentation论文笔记
相关工作: 将R-CNN推广到RGB-D图像,引入一种新的编码方式来捕获图像中像素的地心姿态,并且这种新的编码方式比单纯使用深度通道有了明显的改进. 我们建议在每个像素上用三个通道编码深度图像:水平视 ...
- logstash-out-mongodb实现elasticsearch到Mongodb的数据同步
本文主要实现将Elasticsearch中的索引数据Index同步到Mongodb中的集合collection中. 0.前提 1)已经安装好源数据库:elasticsearch V2.X; 2)已经安 ...