题目
给出一棵二叉树的后序遍历和中序遍历,求这棵二叉树的层序遍历序列。
输入
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出
4 1 6 3 5 7 2
代码
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 100;
int pro[maxn],in[maxn]; //pro后序,in中序
int n; //结点个数
struct Node{
int data;
Node *lchild,*rchild;
}; //结点
//通过后序和中序求二叉树
Node *create(int proL,int proR,int inL,int inR){
//后序区间[proL,proR],中序区间[inL,inR]
int k,numLeft; //k为当前根结点在中序中的位置
if(proL > proR){ //结点数小于等于0
return NULL;
}
Node *root = new Node; //建立一个新结点为根结点
root->data = pro[proR]; //根结点为后序最后一个结点
for(k = inL; k <= inR; k++){
if(in[k] == pro[proR]) //找到根结点在中序中的位置
break;
}
numLeft = k - inL; //当前左子树的个数
//左子树后序[proL,proL + numLeft - 1],中序[inL,k - 1]
root->lchild = create(proL, proL + numLeft - 1, inL, k - 1);
//右子树后序[proL + numLeft,proR - 1],中序[k + 1,inR]
root->rchild = create(proL + numLeft, proR - 1, k + 1, inR);
return root; //返回当前根结点
}
int num = 0;//已经输出的结点个数
//BFS求层序序列
void BFS(Node *root){
queue<Node*> Q; //建立一个队列
Q.push(root); //将根结点入队列
while(!Q.empty()){
Node *now = Q.front(); //取出队首
Q.pop();
printf("%d", now->data); //输出队首值
num++; //计数变量加1
if(num < n){ //序列未输出结束则输出一个空格
printf(" ");
}
if(now->lchild != NULL) Q.push(now->lchild); //左子树非空则将左子树入队列
if(now->rchild != NULL) Q.push(now->rchild); //右子树非空则将右子树入队列
}
}
int main(int argc, char** argv) {
int i;
scanf("%d",&n); //输入结点个数
for(i = 0; i < n; i++){
scanf("%d",&pro[i]); //输入后序序列
}
for(i = 0; i < n; i++){
scanf("%d",&in[i]); //输入中序序列
}
Node *root = create(0, n-1, 0, n-1); //求二叉树
BFS(root); //层序遍历输出
printf("\n");
return 0;
}