该博客已被访问logo services

已知二叉树先序和中序,求后序

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char s1[1001],s2[1001];
int ls,cnt,s2tmp;
char ch;

struct Tree{
    char v;
    int l,r;
}tree[10001];

template<class T>void read(T &x){x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9'){f|=(ch=='-');ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=f?-x:x;return;}
template<class T>void write(T x){if(x<0)putchar('-'),write(-x);else if(x<10)putchar(x+'0');else write(x/10),putchar(x%10+'0');}

int findMid(int head,int end){
    ch=s2[s2tmp++];
    for(int j=head;j<=end;j++){
        if(s1[j]==ch)
            return j;
    }
    
}

int bt(int head,int end){
    cout<<head<<" "<<end<<endl;
    if(head<0||end>=ls||head>end)
        return 0;
    int mid=findMid(head,end);
    int tmp=++cnt;
    tree[tmp].v=s1[mid];
    tree[tmp].l=bt(head,mid-1);
    tree[tmp].r=bt(mid+1,end);
    return tmp;
}

void preOrder(int i){
    if(!i)return;
    cout<<tree[i].v;
    preOrder(tree[i].l);
    preOrder(tree[i].r);
}

void postOrder(int i){
    if(!i)return;
    postOrder(tree[i].l);
    postOrder(tree[i].r);
    cout<<tree[i].v;
}

int main(){
    cin>>s2>>s1;//s1中序,s2前序
    ls=strlen(s1);
    bt(0,ls-1);
    cout<<endl;
    for(int i=0;i<=cnt;i++){
        cout<<i<<" "<<tree[i].v<<" "<<tree[i].l<<" "<<tree[i].r<<endl;
    }
    postOrder(1);




    return 0;
}

rt,思路先找到根节点,再将中序分成两部分,根节点左侧为左子树,根节点右侧为右子树,将每部分看成独立的二叉树,依次找到每部分的根节点,递归上述操作。

posted @ 2020-12-19 18:39  方舟zzz  阅读(87)  评论(0)    收藏  举报