#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; const int maxn=50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn];//先序、中序及后序 int n;//结点个数 //当前二叉树的后序序列区间为[postL,postR],中序序列区间为[inL,inR] //create函数返回构建出的二叉树的根结点地址 node* create(int postL,int postR,int inL,int inR){ if(postL>postR){ return NULL; } node* root=new node;//新建一个新的结点,用来存放当前二叉树的根结点 root->data=post[postR];//新结点的数据域为根结点的值 int k;//这个k不要在for里面定义了,注意有效域 for(k=inL;k<inR;k++){ if(in[k]==post[postR]){ //在中序序列中找到in[k]==pre[L]的结点 break; } } int numLeft=k-inL; //左子树的结点个数 //返回左子树的根结点地址,赋值给root的左指针 root->lchild=create(postL,postL+numLeft-1,inL,k-1); //返回右子树的根结点地址,赋值给root的右指针 root->rchild=create(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(); printf("%d",now->data); //访问队首元素 num++; if(num<n) printf(" "); if(now->lchild != NULL) q.push(now->lchild); //左子树非空 if(now->rchild != NULL) q.push(now->rchild); //右子树非空 } } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&post[i]); } for(int i=0;i<n;i++){ scanf("%d",&in[i]); } node* root=create(0,n-1,0,n-1); //建树 BFS(root); system("pause"); return 0; }