[二叉树]根据中序后序排列求先序排列

题目链接

中序+后序->先序

#include
using namespace std;
#define endl '\n'
using ll = long long;
using pii = pair<int,int>;
using ar2 = array<int,2>;
using ar3 = array<int,3>;
using ar4 = array<int,4>;

void cmax(int &a,int b){a=max(a,b);};
void cmin(int &a,int b){a=min(a,b);};
const int N=10,MOD=1e9+7,INF=0x3f3f3f3f;const long long LINF=LLONG_MAX;const double eps=1e-6;
int in[N],post[N],tree[N<<2];
int n;

void build(int inl,int postl,int len,int pos){
    int root = post[postl+len-1];
    tree[pos]=root;

    if(len==1) return;

    int i=0;
    while(in[inl+i]!=root) i++;//在中序序列中找到根的下标
    int l=i,r=len-i-1;//l,r为左右子树长度
    if(l) build(inl, postl,l,pos<<1);
    if(r) build(inl+l+1,postl+l,r,pos<<1|1);
}

void preprint(int node){
    if(node>n*4||tree[node]==0){
        return;
    }
    cout<<(char)(tree[node]-1+'A');
    preprint(node<<1);
    preprint(node<<1|1);
}

void solve(){
    string s;cin>>s;
    for(int i=0;i<s.size();i++){
        in[i]=s[i]-'A'+1;
    }
    cin>>s;
    for(int i=0;i<s.size();i++){
        post[i]=s[i]-'A'+1;
    }
    n=s.size();
    build(0,0,n,1);

    preprint(1);
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    
    int T=1;
    // cin>>T;
    while(T--) solve();
}

中序+先序->后序

#include
using namespace std;
#define endl '\n'


void cmax(int &a,int b){a=max(a,b);};
void cmin(int &a,int b){a=min(a,b);};
const int N=1000,MOD=1e9+7,INF=0x3f3f3f3f;const long long LINF=LLONG_MAX;const double eps=1e-6;
int tree[N<<2],pre[N],in[N];
int n;

void build(int inl,int prel,int len,int pos){
    int root=pre[prel];
    tree[pos]=root;

    if(len==1) return;
    int i=0;

    while(in[inl+i]!=root) i++;
    int l=i,r=len-i-1;
    if(l) build(inl,prel+1,l,pos<<1);
    if(r) build(inl+l+1,prel+l+1,r,pos<<1|1);
}

void postprint(int node){
    if(tree[node]==-1){
        return;
    }

    postprint(node<<1);
    postprint(node<<1|1);
    cout<<(char)(tree[node]-1+'A');
}

void solve(){
    string s;
    while(cin>>s){
        n=s.size();
        memset(tree,-1,sizeof tree);
        memset(pre,0,sizeof pre);
        memset(in,0,sizeof in);

        for(int i=0;i<s.size();i++){
            pre[i]=s[i]-'A'+1;
        }
        cin>>s;
        for(int i=0;i<s.size();i++){
            in[i]=s[i]-'A'+1;
        }

        build(0,0,n,1);
        postprint(1);
        cout<<endl;
    }
}



你可能感兴趣的:(算法)