因为前序最先访问的一定是根节点,所以我们可以令root为前序中当前根节点的下标,通过找到pre[root]在中序中的位置,可以将中序的左子树与右子树划分出来。start与end划定子树的节点在中序中的范围,递归打印后序序列,出口为start>end。
#include<bits/stdc++.h>
using namespace std;
int in[50],pre[50];
int n;
int build(int root,int start,int end){
if(start>end) return 0;
int i=start;
while(in[i]!=pre[root]) i++;
build(root+1,start,i-1);
build(root+i-start+1,i+1,end);
printf("%d ",pre[root]);
}
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++) cin>>pre[i];
for(i=0;i<n;i++) cin>>in[i];
build(0,0,n-1);
return 0;
}
建树:
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int maxn=10005;
struct BitNode{
int val;
BitNode *lchild,*rchild;
};
BitNode* T;
BitNode* CreateBitNode(int *pre,int *in,int len)
{
int i,j;
if(len==0)
return NULL;
for(i=0;i<len;i++)
if(in[i]==pre[0]) break;
BitNode* p=new BitNode;
p->val=pre[0];
p->lchild=CreateBitNode(pre+1,in,i);
p->rchild=CreateBitNode(pre+i+1,in+i+1,len-i-1);
return p;
}
void Traver(BitNode *T)
{
if(!T)
return;
Traver(T->lchild);
Traver(T->rchild);
cout<<T->val<<' ';
}
int main()
{
int t;
int pre[maxn],in[maxn];
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&pre[i]);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
T=CreateBitNode(pre,in,n);
Traver(T);
cout<<endl;
}
return 0;
}