HDU 1710 Binary Tree Traversals 題解
阿新 • • 發佈:2018-12-16
由題意得:
1.輸入二叉樹的前序遍歷和中序遍歷,輸出這個二叉樹的後序遍歷
2.前序遍歷的順序是:根-左子樹-右子樹 中序遍歷的順序是:左子樹-根-右子樹 後序遍歷的順序是:左子樹-右子樹-根
3.根據前後遍歷找到根後(由定義得:前序遍歷的第一個為主根),可以將二叉樹分為兩個部分(左子樹、右子樹)
4.重複上一個步驟,直到遍歷完所有數字
5.後序遍歷就是將每次找到的根存入陣列
6.圖示如下:
7.程式碼如下:
#include<iostream> using namespace std; const int N=1005; int pre[N],mid[N],last[N],n; void getlast(int pa,int pb,int ma,int mb,int la,int lb) { if(pa>pb||ma>mb||la>lb) return ; int a,b,i; for(i=ma; i<=mb; i++) if(mid[i]==pre[pa]) break; a=i-ma; b=mb-i; last[lb]=mid[i]; getlast(pa+1,pa+a,ma,i-1,la,la+a-1); getlast(pb-b+1,pb,i+1,mb,lb-b,lb-1); } int main() { while(cin>>n) { for(int i=1; i<=n; i++) cin>>pre[i]; for(int i=1; i<=n; i++) cin>>mid[i]; getlast(1,n,1,n,1,n); for(int i=1; i<n; i++) cout<<last[i]<<" "; cout<<last[n]<<endl; } return 0; }