1020. Tree Traversals (25)
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 (<=30), 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 7Sample Output:
4 1 6 3 5 7 2
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
const int maxx = 32;
typedef struct Tree{
Tree *le;
Tree *ri;
int data;
}Tree;
Tree *root;
int pos[maxx],in[maxx];
void printLevelOrder(Tree *root){
queue<Tree *> que;
Tree *tr = NULL;
que.push(root);
bool flg = true;
while(!que.empty()){
tr = (Tree *)que.front();
que.pop();
if(tr==NULL)continue;
if(flg){
printf("%d",tr->data);
flg = false;
}else{
printf(" %d",tr->data);
}
que.push(tr->le);
que.push(tr->ri);
}
printf("\n");
}
//构造树pl为后序序列的左边界pr为其右边界
//il为中续遍历的左边界ir为其右边界
Tree *buildTree(int pl,int pr,int il,int ir){
if(pl>pr)return NULL;
int p = il;
while(in[p]!=pos[pr])++p;
Tree *tree = (Tree *)malloc(sizeof(Tree));
tree->data = pos[pr];
tree->le = buildTree(pl,pr-ir+p-1,il,p-1);
tree->ri = buildTree(pr-ir+p,pr-1,p+1,ir);
return tree;
}
int main(){
int n,i;
Tree *root;
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d",&pos[i]);
}
for(i=0;i<n;++i){
scanf("%d",&in[i]);
}
root=buildTree(0,n-1,0,n-1);
printLevelOrder(root);
return 0;
}
代码还是很简单的。
下面写了一下已知前序和中序构造树的方法,原理是一样的。
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
const int maxx = 32;
typedef struct Tree{
Tree *le;
Tree *ri;
int data;
}Tree;
Tree *root;
int pre[maxx],in[maxx];
void printLevelOrder(Tree *root){
queue<Tree *> que;
Tree *tr = NULL;
que.push(root);
bool flg = true;
while(!que.empty()){
tr = (Tree *)que.front();
que.pop();
if(tr==NULL)continue;
if(flg){
printf("%d",tr->data);
flg = false;
}else{
printf(" %d",tr->data);
}
que.push(tr->le);
que.push(tr->ri);
}
printf("\n");
}
//构造树pl为前序序列的左边界pr为其右边界
//il为中续遍历的左边界ir为其右边界
Tree *buildTree(int pl,int pr,int il,int ir){
if(pl>pr)return NULL;
int p = il;
while(in[p]!=pre[pl])++p;
Tree *tree = (Tree *)malloc(sizeof(Tree));
tree->data = pre[pl];
tree->le = buildTree(pl+1,pl+p-il,il,p-1);
tree->ri = buildTree(pl+p-il+1,pr,p+1,ir);
return tree;
}
void printPre(Tree *root){
if(root==NULL)return;
printf("%d ",root->data);
printPre(root->le);
printPre(root->ri);
}
int main(){
int n,i;
Tree *root;
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d",&pre[i]);
}
for(i=0;i<n;++i){
scanf("%d",&in[i]);
}
root=buildTree(0,n-1,0,n-1);
printLevelOrder(root);
//printPre(root);
return 0;
}