1. 程式人生 > 實用技巧 >已知二叉樹先序和中序,求後序

已知二叉樹先序和中序,求後序

#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,思路先找到根節點,再將中序分成兩部分,根節點左側為左子樹,根節點右側為右子樹,將每部分看成獨立的二叉樹,依次找到每部分的根節點,遞迴上述操作。