思路
我們定義post_order(str1, str2)爲一棵前序遍歷的結果爲str1,中序遍歷的結果爲str2的二叉樹的後序遍歷的結果。
如果要求解post-order(str1, str2)的話,首先不難發現,根據‘前序遍歷’str1=‘根節點’+‘左子樹的前序遍歷’+‘右子樹的前序遍歷’,我可以知道這棵二叉樹的根節點root便是str1的第一個字符。
在知道了‘根節點’root之後,便可以利用‘中序遍歷’str2=‘左子樹的中序遍歷’+‘根節點’+‘右子樹的中序遍歷’,求解出‘左子樹的中序遍歷’str2L和‘右子樹的中序遍歷’str2R。
由於一棵子樹的前序遍歷和中序遍歷的長度相同,那麼仍然是根據‘前序遍歷’str1=‘根節點’+‘左子樹的前序遍歷’+‘右子樹的前序遍歷’,我可以知道從str1的第2個字符開始的str2L.length()個字符便是‘左子樹的前序遍歷’str1L,而這之後的部分便是‘右子樹的前序遍歷’str1R。
實現
#include <iostream>
#include <string>
using namespace std;
void post(string pre,string mid){
if(pre.length() <= 1){
cout << pre;return;
}
size_t loc = mid.find(pre[0]);
post(pre.substr(1,loc),mid.substr(0,loc));
post(pre.substr(loc+1),mid.substr(loc+1));
cout << pre[0];
}
int main(){
string pre,mid;
cin >> pre >> mid;
post(pre,mid);
return 0;
}