给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
思路
由中序和后序遍历建树,然后用队列进行层序遍历
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 100;
struct node{
int data;
node* lchild;
node* rchild;
};
int pre[maxn], in[maxn], post[maxn];
int n;
node* creat(int postL, int postR, int inL, int inR){
if(postL > postR) return NULL;//后序序列长度<0,结束
node* root = new node;//存根
root->data = post[postR];//后序遍历最后一个为根
int k;
for(k = inL; k <= inR; k++){//在中序遍历中找到根
if(in[k] == post[postR]) break;
}
int numLeft = k-inL;//左子树结点数
root->lchild = creat(postL, postL+numLeft-1, inL, k-1);//左子树根结点
root->rchild = creat(postL+numLeft, postR-1, k+1, inR);//右子树根结点
return root;
}
int num = 0;
void BFS(node* root){
queue<node*> q;
q.push(root);
while(!q.empty()){
node* now = q.front();
q.pop();
cout <<now->data;
num++;
if(num < n) cout << ' ';
if(now->lchild != NULL) q.push(now->lchild);//左子树非空
if(now->rchild != NULL) q.push(now->rchild);//右子树非空
}
}
int main(){
//ios::sync_with_stdio(false);
cin >> n;
for(int i = 0; i < n; i++){
cin >> post[i];
}
for(int i = 0; i < n; i++){
cin >> in[i];
}
node* root = creat(0, n-1, 0, n-1);
BFS(root);
return 0;
}
拓展
void postorder(int preL, int preR, int inL, int inR){
if(preL > preR) return;
int k;
for(k = inL; k <= inR; k++){
if(pre[preL] == in[k]) break;
}
int numLeft = k-inL;
postorder(preL+1, preL+numLeft, inL, k-1);
postorder(preL+numLeft+1, preR, k+1, inR);
cout << in[k]<<' ';
}
void preorder(int postL, int postR, int inL, int inR){
if(postL > postR) return;
int k;
for(k = inL; k <= inR; k++){
if(post[postR] == in[k]) break;
}
int numLeft = k-inL;
cout << in[k]<<' ';
preorder(postL, postL+numLeft-1, inL, k-1);
preorder(postL+numLeft, postR-1, k+1, inR);
}