如何求先序排列和後序排列——hihocoder+洛谷例題【二叉樹遞歸搜索】
阿新 • • 發佈:2018-07-28
define second [] tor 記錄 例題 .com 內存限制 行為
【已知先序、中序求後序排列】:
[#1049 : 後序遍歷](http://hihocoder.com/problemset/problem/1049) 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 小Ho在這一周遇到的問題便是:給出一棵二叉樹的前序和中序遍歷的結果,還原這棵二叉樹並輸出其後序遍歷的結果。 提示:分而治之——化大為小,化小為無 輸入 每個測試點(輸入文件)有且僅有一組測試數據。 每組測試數據的第一行為一個由大寫英文字母組成的字符串,表示該二叉樹的前序遍歷的結果。 每組測試數據的第二行為一個由大寫英文字母組成的字符串,表示該二叉樹的中序遍歷的結果。 對於100%的數據,滿足二叉樹的節點數小於等於26。 輸出 對於每組測試數據,輸出一個由大寫英文字母組成的字符串,表示還原出的二叉樹的後序遍歷的結果。 樣例輸入 AB BA 樣例輸出 BA
【分析】:在註釋裏面。
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #include<cctype> #include<stack> #include<sstream> #include<list> #include<assert.h> #include<bitset> #include<numeric> #define debug() puts("++++") #define gcd(a,b) __gcd(a,b) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define fi first #define se second #define pb push_back #define sqr(x) ((x)*(x)) #define ms(a,b) memset(a,b,sizeof(a)) #define sz size() #define be begin() #define pu push_up #define pd push_down #define cl clear() #define lowbit(x) -x&x #define all 1,n,1 #define rep(i,x,n) for(int i=(x); i<(n); i++) #define in freopen("in.in","r",stdin) #define out freopen("out.out","w",stdout) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> P; const int INF = 0x3f3f3f3f; const LL LNF = 1e18; const int maxn = 1e3 + 20; const int maxm = 1e6 + 10; const double PI = acos(-1.0); const double eps = 1e-8; const int dx[] = {-1,1,0,0,1,1,-1,-1}; const int dy[] = {0,0,1,-1,1,-1,1,-1}; int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; string a,b; string dfs(int l1,int l2,int len)//l1前序起點、l2中序起點、len是樹的總長 { int i; if(len<=0) return ""; for(i=l2;i<l2+len;i++) { if(b[i]==a[l1]) break;//用i記錄當前根節點 } int cnt=i-l2;//左子樹遍歷的長度 string a1 = dfs(l1+1,l2,cnt);//遞歸左子樹,左子樹先序遍歷起始點為l1+1,左子樹中序遍歷起始點始終為l2 string a2 = dfs(l1+cnt+1,i+1,len-cnt-1);//遞歸右子樹,右子樹先序遍歷起始點在左子樹右側為l1+cnt+1,右子樹中序遍歷始終在根節點i右側為i+1 return a1+a2+a[l1];//由於是後序遍歷 層數最低的根節點放置末尾 } int main() { while(cin>>a>>b) { cout<< dfs(0,0,a.length()) << endl; } }
如何求先序排列和後序排列——hihocoder+洛谷例題【二叉樹遞歸搜索】