1. 程式人生 > >如何求先序排列和後序排列——hihocoder+洛谷例題【二叉樹遞歸搜索】

如何求先序排列和後序排列——hihocoder+洛谷例題【二叉樹遞歸搜索】

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+洛谷例題【二叉樹遞歸搜索】