時間限制:10000ms
單點時限:1000ms
內存限制:256MB
描述
在參與過了美食節之後,小Hi和小Ho在別的地方又玩耍了一陣子,在這個過程中,小Ho得到了一個非常有意思的玩具——一棵由小球和木棍連接起來的二叉樹!
小Ho對這棵二叉樹愛不釋手,於是給它的每一個節點都標記了一個標號——一個屬於A..Z的大寫字母,並且沒有任意兩個節點的標號是一樣的。小Hi也瞅準了這個機會,重新鞏固了一下小Ho關於二叉樹遍歷的基礎知識~就這樣,日子安穩的過了兩天。
這天,小Ho正好在求解這棵二叉樹的前序、中序和後序遍歷的結果,但是卻在求出前序遍歷和中序遍歷之後不小心把二叉樹摔到了地上,小球和木棍等零件散落了一地!
小Ho損失了心愛的玩具,正要嚎啕大哭起來,所幸被小Hi發現了,勸說道:“彆着急,這不是零件都還在麼?拼起來不就是了?”
“可是我忘記了二叉樹長什麼樣子了!”小Ho沮喪道。
“這個簡單,你不是剛剛求出了這棵二叉樹的前序和中序遍歷的結果麼,利用這兩個信息就可以還原出整棵二叉樹來哦!”
“這樣麼?!!”小Ho止住了淚水,問道:“那要怎麼做呢?”
沒錯!小Ho在這一週遇到的問題便是:給出一棵二叉樹的前序和中序遍歷的結果,還原這棵二叉樹並輸出其後序遍歷的結果。
提示:分而治之——化大爲小,化小爲無輸入
每個測試點(輸入文件)有且僅有一組測試數據。
每組測試數據的第一行爲一個由大寫英文字母組成的字符串,表示該二叉樹的前序遍歷的結果。
每組測試數據的第二行爲一個由大寫英文字母組成的字符串,表示該二叉樹的中序遍歷的結果。
對於100%的數據,滿足二叉樹的節點數小於等於26。
輸出
對於每組測試數據,輸出一個由大寫英文字母組成的字符串,表示還原出的二叉樹的後序遍歷的結果。
AB BA樣例輸出
BA
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String str1=scan.next();
String str2=scan.next();
Main main=new Main();
System.out.println(main.solve(str1,str2));
}
StringBuffer re=new StringBuffer();
private String solve(String a, String b) {
if(a.length()==0) return "";
re=new StringBuffer();
dfs(a,b);
return re.toString();
}
public void dfs(String a,String b){
if(a.length()==0) return;
if(a.length()==1){
re.append(a);
return;
}
int mid=find(a.charAt(0),b);
dfs(a.substring(1,1+mid),b.substring(0,mid));
dfs(a.substring(mid+1),b.substring(mid+1));
re.append(a.charAt(0));
}
public int find(char ch,String a){
for(int i=0;i<a.length();i++){
if(a.charAt(i)==ch) return i;
}
return -1;
}
}