HihoCoder第十周——已知前序中序求后序

来源:互联网 发布:好帮手软件简介 编辑:程序博客网 时间:2024/06/04 19:00

思路

我们定义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;}