给定前序和中序遍历,输出后序遍历。

啊啊啊啊,今天有事没能去听老赵的讲座好遗憾。上一次是范玮琪张敬轩的演唱会,开在家门口的演唱会都没去。这次是ssp计划发起者的讲座,同样是开在家门口的,我都与之插肩而过。

从这一篇开始就是正式的“技术”博客了。姑且叫“技术”吧,词穷,我知道技术含量不高。。若有任何想法,欢迎大家一起交流讨论。

今天看了《ACM-ICPC程序设计系列:图论及应用》第二章关于树的部分。主要是关于一些树的定义和一些算法。

书上的例题只给了思路没有代码。我在网上找到了原题。

View Code
/*
【题目来源】 
http://acm.cs.ecnu.edu.cn/problem.php?problemid=1284

【题目分析】 
给定树的前序遍历和中序遍历,要求输出后序遍历。

【思路分析】 
1.前序遍历中:第一个元素就是根。 

2.中序遍历中:
找到根的位置。
根的左边是根的左子树的中序遍历,右边是根的右子树的中序遍历。
得到左子树元素个数L。

3.前序遍历中:
除去根,前L个元素是左子树的前序遍历。剩下的是右子树的前序遍历。 

4.这样就得到了左子树和右子树的前序遍历和中序遍历。对左子树和右子树递归下去,一定会出现树空的情况或只剩下一个元素的情况。
当树空的时候返回,当元素只有一个的时候,输出来并返回。 对左子树和右子树递归下去完成后就输出根节点。这样就得到了完整的后序遍历。 

【附加细节】 
substr(index, n) 从index开始(包括index)连续n个

【小小感受】 
这道题思路清晰的时候写的,一次就AC了,感觉很好。以前很多情况总是思路没那么清晰就开始敲代码,结果就是要修改好多次才能AC。
所以呢。。思考还是比较重要的。 
*/
#include <iostream>
#include <string>
using namespace std;

void solve(string pre, string in)
{
    if (pre.size() <= 1)
    {
        if (pre.size() == 1)
            cout << pre[0];
        return;
    }
    int index = in.find(pre[0]);

    string left_Pre = pre.substr(1, index);

    string right_Pre = pre.substr(index+1, pre.size()-1-index);

    string left_In = in.substr(0, index);

    string right_In = in.substr(index+1, in.size()-1-index);

    solve(left_Pre, left_In);//

    solve(right_Pre, right_In);//

    cout << pre[0];//

    return;
}

int main()
{
    string pre, in, post;

    while (cin >> pre >> in)
    {
        solve(pre, in);

        cout << endl;
    }
}

 

 

 

 

 

 

 

 

posted @ 2012-11-24 19:30  Norcy  阅读(1500)  评论(0编辑  收藏  举报