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

啊啊啊啊,今天有事没能去听老赵的讲座好遗憾。上一次是范玮琪张敬轩的演唱会,开在家门口的演唱会都没去。这次是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;

    }

}

 

 

 

 

 

 

 

 

你可能感兴趣的:(遍历)