1. 程式人生 > >由先序遍歷和中序遍歷序列建立二叉樹——

由先序遍歷和中序遍歷序列建立二叉樹——

Description

按先序順序和中序順序輸入二叉樹的2個遍歷序列,採用二叉連結串列建立該二叉樹並用後序遍歷順序輸出該二叉樹的後序遍歷序列。
Input

輸入資料有多組,對於每組測試資料
第一行輸入二叉樹的先序序列,第二行為中序序列。
Output

對於每組測試資料輸出該二叉樹的後序序列
Sample Input

abdcef
dbaecf
Hint

dbefca

題意:

給你一個串的先序和中序遍歷,要求輸出後序遍歷

題解:

判斷一個位置的左右子樹是這樣的:
在樣例中,首先我們得到了a,因為它是根,然後在中序遍歷中找到a,那麼db就是它的左子樹,ecf是它的右子樹,接下來是b,d是它的左子樹,但是由於它的右邊就是a了,那麼它沒有右子樹,所以引數由(1,0,len-1,0,len-1)變成(2,1,2,0,1),以此類推。
所以我們在dfs的時候只需要傳五個引數:(當前位置,先序遍歷當前位置的左端點,先序遍歷當前位置的右端點,中序遍歷當前位置的左端點,中序遍歷當前位置的右端點)

#include<bits/stdc++.h>
using namespace std;
char val[100005];
string s1,s2;
int num,len,pos1,pos2;
void dfs(int root,int l1,int r1,int l2,int r2)
{
	val[root]=s1[l1];
	if(l1==r1)
        return ;
    int ne=l2;
    while(s2[ne]!=s1[l1])
        ne++;
    if(ne!=l2)
        dfs(root<<1,l1+
1,l1+ne-l2,l2,ne-1); if(ne!=r2) dfs(root<<1|1,l1+ne-l2+1,r1,ne+1,r2); } void dfs2(int root) { if(val[root<<1]) dfs2(root<<1); if(val[root<<1|1]) dfs2(root<<1|1); printf("%c",val[root]); } int main() { while(cin>>s1) { memset(val,0,sizeof(val)
); cin>>s2; len=s1.length(); num=1,pos2=pos1=0; dfs(1,0,len-1,0,len-1); dfs2(1); printf("\n"); } return 0; }