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 ...
随机推荐
- [LeetCode 题解]: Reverse Nodes in K-Groups
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a li ...
- struts2获取request、session、application的四种方式
struts2获取request.session.application的四种方式 //获取map类型的request.session.application public class LoginAc ...
- Win 8下Rime输入法无法同步的临时解决方法
意外发现了Rime输入法(OS X上叫鼠须管'Squirrel',windows上叫小狼毫'Weasel',linux上叫中州韵'ibus-rime',连名字都起的这么牛逼),真是神器啊,流畅的速度, ...
- xml写入
XmlDocument xmlDocument=new XmlDocument(); XmlElement root = xmlDocument.CreateElement("", ...
- C#语言各个版本特性(二)
二.排序Product 1.按名称对产品进行排序,以特定顺序显示一个列表的最简单方式就是先将列表排序,再遍历并显示其中的项. C#1.1 使用IComparer对ArrayList进行排序 produ ...
- Asp.NetCore安全验证之JWT
本文只是介绍了下基于AspNetCore自带的System.IdentityModel.Tokens.Jwt.dll工具在项目中Token的应用. 我这里谈到的很浅显就两点: 一,超时时间 二,数据的 ...
- VUE环境安装和创建项目
1.首先要安装nodejs和npm. 下载nodejs安装,下载地址:https://nodejs.org/en/ 安装很简单一路next即可. 安装完成后可以在cmd窗口输入node -v 和 np ...
- 基于SSH的网上体育用品商城-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 网上体育商城的主要功能包括:前台用户登录退出.注册.在线购物.修改个人信息.后台商品管理等等.本系统结构如下 ...
- “全栈2019”Java第九十九章:局部内部类与继承详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- kinect 2 for xbox畸变矫正
kinect 2 for xbox畸变矫正 畸变校正的详细方法在iai_kinect2/kinect2_calibration的readme文件中. 由于通过kinect2获得的图像数据有不同的模式( ...