此题涉及到二叉树的遍历以及二叉树的建立
#include <iostream>
#include <string>
using namespace std;
struct Node //定义树的结点
{
Node *lchild;
Node *rchild;
char c;
};
Node Tree[50]; //结点数组
string str1,str2;
void postOrder(Node *T)
{
if (T->lchild != NULL)
{
postOrder(T->lchild);
}
if (T->rchild != NULL)
{
postOrder(T->rchild);
}
cout << T->c;
}
int local;
Node* creat() //从结点数组中拿出一个结点进行初始化后,返回它的地址
{
Tree[local].lchild = Tree[local].rchild = NULL;
local++;
return &Tree[local-1];
}
Node* build(int s1,int e1,int s2,int e2) //建树函数
{
Node* ret = creat(); //为每次递归的根结点申请空间,并进行初始化
ret->c = str1[s1]; //找到前序遍历的第一个结点
int idx = str2.find(str1[s1]); //找到前序遍历根结点字符在中序遍历中的位置
if (idx != s2) //若左子树不为空,递归还原左子树
{
ret->lchild = build(s1+1,s1+(idx-s2),s2,idx-1);
}
if (idx != e2) //若右子树不为空,递归还原右子树
{
ret->rchild = build(s1+(idx-s2)+1,e1,idx+1,e2);
}
return ret;
}
int main()
{
while (cin >> str1 >> str2)
{
int len1 = str1.size();
int len2 = str2.size();
local = 0; //确保对每个测试用例结点数组中的元素会重新初始化
Node* T = build(0,len1-1,0,len2-1); //建树
postOrder(T); //后序遍历
cout << endl;
}
return 0;
}