1.解体思路,寻找先序中序后序中顶点的位置,用递归计算。
以下是解体思路:(摘自http://www.cnblogs.com/allensun/archive/2010/11/05/1870214.html)
preorder的第一个节点D就是这棵树的根节点,即为postorder中的最后一个元素
然后在inorder中找到该节点D,其左边为ABC为该根节点左子树的inorder,右边EFG为右子树inorder
对应的preorder中BAC为该根节点左子树的perorder,EGF为右子树preorder
再递归对左右子树应用同样的方法
2.体会递归函数的写法。确定使用递归函数之后,对第一次递归时的计算顺序编写程序,难点是参数的设置
3.使用引用,并加const关键字,表示引用变量不能改变原变量的值。
#include<stdio.h> #include<iostream> #include<string> using namespace std; string pre, in; void Creat_Post(const string &pre, const string &in, string &post, int end) { if (pre == "") return; post[end] = pre[0]; unsigned int root = in.find(pre[0]); int leftL = root; int rightL = pre.size() - leftL - 1; Creat_Post(pre.substr(1 + leftL), in.substr(root + 1), post, end - 1); Creat_Post(pre.substr(1, leftL), in.substr(0, leftL), post, end - 1 - rightL); } int main() { while(cin >> pre >> in) { int len = pre.size(); string post(len,'0'); Creat_Post(pre, in, post, len -1); cout << post << endl; } return 0; }