P1030 求先序排列
阿新 • • 發佈:2020-08-17
題目大意:
給定一棵二叉樹的中序和後序遍歷,求先序遍歷。
例如中序遍歷\(ACGDBHZKX\),後序遍歷為\(CDGAHXKZB\),那麼先序遍歷就是\(BAGCDZHKX\)
思路:
首先我們知道二叉樹的先序遍歷是先訪問根再訪問子樹,那麼對於這道題來說要求先序遍歷結果,我們就每次執行函式輸出當前子樹它的根即可,那麼問題來了:
1.根怎麼求?
根就是後序遍歷的最後一個結點,例如\(CDGAHXKZB\),則這顆二叉樹的根就是\(B\)。
2.左右子樹怎麼表示呢?
我們已經找到了根為\(B\),用\(find\)函式找到\(B\)的位置,根據中序遍歷是先訪問左(右)子樹在訪問根,然後再訪問右(左)子樹
因此剩下的我們只需要遞迴執行同樣的過程就可了。
PS:想出這個思路的人一定是個巨佬
程式碼
#include <iostream> #include <string> using namespace std; //後序遍歷找根 中序遍歷找根分為兩棵子樹 void res(string in, string after) { if(in.size() > 0) { char ch = after[after.size()-1];//找到根並輸出 cout << ch; int k = in.find(ch); //4 res(in.substr(0, k), after.substr(0, k)); //中序遍歷左 後序遍歷左 res(in.substr(k+1), after.substr(k, in.size()-k-1)); //中序遍歷右 後序遍歷右 } } int main() { string in, after; cin >> in; cin >> after; res(in, after); return 0; }