1364:二叉樹遍歷(flist)
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
樹和二叉樹基本上都有先序、中序、後序、按層遍歷等遍歷順序,給定中序和其它一種遍歷的序列就可以確定一棵二叉樹的結構。
假定一棵二叉樹一個結點用一個字符描述,現在給出中序和按層遍歷的字符串,求該樹的先序遍歷字符串。
【輸入】
兩行,每行是由字母組成的字符串(一行的每個字符都是唯一的),分別表示二叉樹的中序遍歷和按層遍歷的序列。
【輸出】
一行,表示二叉樹的先序序列。
【輸入樣例】
DBEAC
ABCDE
【輸出樣例】
ABDEC
思路:層次遍歷的結果都是根,在遍歷層次遍歷的時候,如果你遍歷左子樹,在左子樹第一次找到與層次遍歷相等的時候,那個就是根,然後遞歸輸出就可以了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
string s1,s2;
void f(int l1,int r1,int l2,int r2)//l1,r1 中序遍歷,l2,r2層次遍歷
{
int i,j;
for(i = l2;i <= r2;i++){//找層次遍歷中優先輸出根節點的位置
int t = 0;
for(j = l1; j <= r1;j++){
if(s2[i] == s1[j]){//輸出根節點
cout << s1[j];
t = 1;
break;
}
}
if(t) break;
}
if(j > l1) f(l1,j-1,0,r2);//遍歷左子樹
if(j < r1) f(j+1,r1,0,r2);//遍歷右子樹
}
int main(){
ios::sync_with_stdio(false);
cin >> s1 >> s2;
f(0,s1.size()-1,0,s2.size()-1);
return 0;
}