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;
}
posted @ 2017-07-17 21:49  Nickqiao  阅读(141)  评论(0编辑  收藏  举报