给定前序和中序遍历,输出后序遍历。
啊啊啊啊,今天有事没能去听老赵的讲座好遗憾。上一次是范玮琪张敬轩的演唱会,开在家门口的演唱会都没去。这次是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; } }
转载请注明出处http://www.cnblogs.com/chenyg32/