参考自:http://blog.csdn.net/u013615904/article/details/51424123
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cstdio>
const int maxn = 3005;
int tree[maxn];
using namespace std;
void build(int treeLocation, vector<int>a, vector<int>b)
{
if(a.size()==0)
return;
int p;
for(int i=0; i<b.size(); i++)
if(b[i]==a[a.size()-1])
{
p = i; //拿到根节点的坐标
break;
}
vector<int> aL, aR, bL, bR;
for(int i=0; i<p; i++)
aL.push_back(a[i]);
for(int i=p; i<a.size()-1; i++)
aR.push_back(a[i]);
for(int i=0; i<p; i++)
bL.push_back(b[i]);
for(int i=p+1; i<b.size(); i++)
bR.push_back(b[i]); //以上四个for均为切割树,将树切割成左右两颗子树
tree[treeLocation] = b[p]; //根节点放进使用数组模拟的二叉树中
build(treeLocation<<1, aL, bL); //这里有移位运算,左移一位,即*2
build(treeLocation<<1|1, aR, bR); //左移一位并且与1进行或运算,结果相当于+1;
}
void BFS() //广度优先遍历
{
if(tree[1]==-1)
return;
queue<int> que;
int root = 1;
cout << tree[root];
if(tree[root<<1]!=-1) que.push(root<<1);
if(tree[root<<1|1]!=-1) que.push(root<<1|1);
while(que.size())
{
root = que.front();
cout << " " << tree[root];
que.pop();
if(tree[root<<1]!=-1) que.push(root<<1);
if(tree[root<<1|1]!=-1) que.push(root<<1|1);//使用队列进行广度优先遍历
}
}
int main()
{
int n;
cin >> n;
vector<int> postTRaversal;
vector<int> inorderTraversal;
int temp;
memset(tree, -1, sizeof(tree));
for(int i=0; i<n; i++)
{
cin >> temp;
postTRaversal.push_back(temp);
}
for(int i=0; i<n; i++)
{
cin >> temp;
inorderTraversal.push_back(temp);
}
build(1, postTRaversal, inorderTraversal);
BFS();
return 0;
}