簡約遞迴AC POJ-2255
阿新 • • 發佈:2018-12-12
題目描述
POJ-2255是一個簡單的二叉樹遍歷問題,給出前序遍歷和中序遍歷結果,求出後序遍歷。大體瀏覽了各位大佬們的程式碼,發現用遞迴完成是比較簡單的選擇,但是大佬的程式碼萌新實在看不懂,只好自己來寫一個了
解決方案
D / \ / \ B E / \ \ / \ \ A C G / / F
這位二叉樹的前序遍歷為DBACEGF,中序遍歷為ABCDEFG。仔細觀察揣摩便可發現前序遍歷的第一個字元(D)肯定是這個子樹的根,而這個根放到中序遍歷中便可將之分為左子樹和右子樹,這裡ABC(左子樹)D(根)EFG(右子樹),這樣就可以遞迴解決了,因為所有的問題都可以交給下一層遞迴來解決,我們只需約定遞迴終止條件即可。 而這裡的終止條件就是前序遍歷和中序遍歷都只有相同的一個字元或均為空。
程式碼實現
#include <iostream>
#include <string>
using namespace std;
void arrange(string pre, string in){
int pos;
if (pre.length()>0){ //pre 和 in長度隨時都相等,若為0,則遞迴到此結束,若為1則會直接輸出
pos = in.find(pre[0]); //pre[0]是根節點,去中序遍歷裡面明確其位置
arrange(pre.substr(1,pos),in.substr(0,pos)); //處理左子樹的前序遍歷和中序遍歷
arrange(pre.substr(pos+ 1),in.substr(pos+1)); //處理右子樹的前序遍歷和中序遍歷
cout<<pre[0]; //輸出根節點
}
}
int main()
{
string pre,in; //string的輸入比較迷,記錄一下
while(cin>>pre>>in){
arrange(pre, in); //處理前序和中序遍歷
cout<<endl;
}
return 0;
}
細節
- 輸出時要加上回車
- #include<string> + using namespace std; 注意不是#include<cstring>
- 自己用筆畫一畫可以方便理解