根据前序与中序输出后序

因为前序最先访问的一定是根节点,所以我们可以令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;
}

猜你喜欢

转载自blog.csdn.net/qq_37016724/article/details/80650593