已知二叉樹先序和中序,求後序
阿新 • • 發佈:2020-12-19
#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,思路先找到根節點,再將中序分成兩部分,根節點左側為左子樹,根節點右側為右子樹,將每部分看成獨立的二叉樹,依次找到每部分的根節點,遞迴上述操作。