代码改变世界

POJ 2255 Tree Recovery解题报告

2011-10-24 15:30  诸葛二牛  阅读(271)  评论(0编辑  收藏  举报

刚开始以为是一个建立树的题目,后来一看就是用递归的思想来处理字符串。

 1 #include <iostream>  
2 #include <string>
3 using namespace std;
4
5 /*核心函数。递归实现。
6 *preStr为先序遍历串,inStr为中序遍历串。
7 *假设preStr为“BCAD”,inStr为“CBAD”。
8 *则先找到根为”B“,根的左孩子为”C“,右孩子为”AD“。
9 *然后递归调用f,得到左孩子和右孩子的后序遍历串,再加上根即可。
10 */
11 string f(string preStr, string inStr) {
12 if(preStr.size() == 0) return "";
13 else {
14 size_t rootPosInInStr = inStr.find(preStr[0]);
15 size_t leftChildSize = rootPosInInStr;
16 size_t rightChildSize = inStr.size() - leftChildSize - 1;
17
18 /*注意,若string::substr()查找不到相应子串,则返回空串(size == 0, 而不是返回NULL)*/
19 return f(preStr.substr(1, leftChildSize), inStr.substr(0, leftChildSize)) +
20 f(preStr.substr(preStr.size() - rightChildSize), inStr.substr(rootPosInInStr + 1)) +
21 preStr[0];
22 }
23 }
24 int main(){
25 string preStr, inStr;
26 while(cin >> preStr >> inStr)
27 cout << f(preStr, inStr) << endl;
28 return 0;
29 }