#include<cstdio> #include<string> using namespace std; struct TreeNode{ char data; TreeNode *leftChild; TreeNode *rightChild; }; TreeNode * rebuild(string preOrder,string inOrder){ //rebuild的返回表示子树根节点的地址 if(preOrder.size() == 0){ return NULL; } else{ //从先序中确定根 char rootdata = preOrder[0]; TreeNode *pNewNode = new TreeNode; pNewNode->data = rootdata; //再用根去切割中序 inOrder.find(rootdata); int pos = inOrder.find(rootdata);//pos是根在中序序列中出现的下标 //preOrder.substr(1,pos);将preOrder切割,取出下标1开始,长度为pos的子串 //preOrder.substr(pos+1); 将preOrder切割,取出下标pos+1开始,到结束位置的子串 //inOrder.substr(0,pos); //inOrder.substr(pos+1); pNewNode->leftChild = rebuild(preOrder.substr(1,pos), inOrder.substr(0,pos)); pNewNode->rightChild = rebuild(preOrder.substr(pos+1), inOrder.substr(pos+1)); return pNewNode; } } void postOrder(TreeNode *root){ if(root == NULL){ return; } postOrder(root->leftChild); postOrder(root->rightChild); printf("%c",root->data); } int main(){ char preOrder[30]; char inOrder[30]; while(scanf("%s%s",preOrder,inOrder) != EOF){ TreeNode * root; root = rebuild(preOrder,inOrder); postOrder(root); printf("\n"); } }