此题根据提示,可知要用分治思想。
任何一棵树都可以分为左子树和右子树,分治到最后必定为:
根节点,只有根节点的左子树,只有根节点的右子树。
此题前序和中序已知,那我们可以根据前序遍历知道根节点。
然后可知 中序遍历为 左+根+右。它的左就是它左子树的中序遍历结果,右就是右子树的中序遍历结果。
如果我们可以知道前序遍历的 左子树和右子树的结果的话,那我们就可以用递归的方法得到了。
又因为 一个树的左子树和右子树的长度是知道的,所以我们可以根据长度来定位前序的左子树和右子树的前序遍历结果,
后续遍历的结果就是 左+右+根
我们设计一个函数为
string FindPostorder(string preorder, string inorder) ;
它的返回结果为 return FindPostorder(preorderL, inorderL) + FindPostOrder(preorderR, preorderR) + root;
上代码:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
string FindPostOrder(string preorder, string inorder)
{
if (preorder.empty())return "";
if (preorder.length() == 1 ) return preorder;
char rootChar = preorder[0];
stringstream strStream;
strStream << rootChar;
string root = strStream.str();
int x = inorder.find(root);
string inorderL = inorder.substr(0, x);
string inorderR = inorder.substr(x + 1, inorder.length());
string preorderL;
string preorderR;
preorderL.assign(preorder, 1, inorderL.length());
preorderR.assign(preorder, 1+preorderL.length(), preorder.length());
return FindPostOrder(preorderL, inorderL) + FindPostOrder(preorderR, inorderR) + (string)root;
}
int main()
{
string A, B;
cin >> A >> B;
cout<<FindPostOrder(A, B);
return 0;
}