#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1000;
char pre[maxn],in[maxn];
struct Node {
char val;
Node *left,*right;
Node(char v=0,Node *l=NULL,Node *r=NULL):val(v),left(l),right(r){}
};
Node *makeTree(int i,int j,int size) //i表示前序遍历序列的开始下标,j是中序遍历的下标,size表示序列长度
{
if(size==0) //size为空说明子树为空树,返回NULL
return NULL;
int root;
for(int k=j;k<j+size;k++) //选择前序遍历中的根在中序遍历序列中的位置,由此确定左右子树的节点个数,root一定可以找到
{
if(pre[i]==in[k])
{
root=k;break;
}
}
int leftNum=root-j; //左子树的节点个数
int rightNum=size-leftNum-1;//右子树的节点个数
Node *left=makeTree(i+1,j,leftNum);//i+1为左子树的根
Node *right=makeTree(i+leftNum+1,root+1,rightNum);//i+leftNum+1为右子树的根
Node *r=new Node(pre[i],left,right);//生成根节点
return r;
}
void deleteTree(Node *root)//递归删除树
{
if(root==NULL) return;
deleteTree(root->left);
deleteTree(root->right);
delete root;
}
void postOrder(Node *root)
{
if(!root) return;
postOrder(root->left);
postOrder(root->right);
printf("%c",root->val);
}
int main()
{
#ifdef LOCAL_DEBUG
freopen("input.txt","r",stdin);
#endif
while(~scanf("%s%s",pre,in))
{
Node *root = makeTree(0,0,strlen(pre));
postOrder(root);
deleteTree(root);
}
return 0;
}
前序加中序求二叉树后序序列
最新推荐文章于 2022-10-23 21:19:17 发布