【树的遍历】前序中序求后序,中序后序求前序
1>求前序
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; string m,f; int len,mid[30],front[30]; int son[30][2],root; int fz(int l1,int r1,int l2,int r2) { if(l1>r1) return 0; if(l1==r1) return front[l1]; int rt=front[l1]; int pos; for(pos=l2;pos<r2;pos++) if(mid[pos]==rt) break; int ln=pos-l2; son[rt][0]=fz(l1+1,l1+ln, l2,l2+ln-1); son[rt][1]=fz(l1+ln+1,r1, l2+ln+1,r2); return rt; } void back(int rt) { if(son[rt][0]) back(son[rt][0]); if(son[rt][1]) back(son[rt][1]); printf("%c",'A'+rt-1); } int main() { cin>>m>>f; len=m.length() ; for(int i=0;i<len;i++) mid[i]=m[i]-'A'+1,front[i]=f[i]-'A'+1; root=fz(0,len-1,0,len-1); back(root); return 0; }
2>求前序
#include<cstdio> #include<cstdlib> #include<iostream> #include<string> using namespace std; string mid,back; int len,m[30],bac[30]; int son[30][2],root; int fz(int l,int r,int l2,int r2)//bac,m { if(l>r) return 0; if(l==r) return bac[r]; int rt=bac[r]; int pos; for(pos=l2;pos<r2;pos++) if(m[pos]==rt) break; int ln=pos-l2-1; son[rt][0]=fz(l,l+ln, l2,l2+ln); son[rt][1]=fz(l+ln+1,r-1,l2+ln+2,r2); return rt; } void front(int rt) { printf("%c",rt+'A'-1); if(son[rt][0]>0) front(son[rt][0]); if(son[rt][1]>0) front(son[rt][1]); } int main() { cin>>mid>>back; len=mid.length() ; for(int i=0;i<len;i++) m[i]=mid[i]-'A'+1,bac[i]=back[i]-'A'+1; root=fz(0,len-1,0,len-1); front(root); return 0; }