HihoCoder第十週——已知前序中序求後序

思路

我們定義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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章