题目描述
用一棵二叉树的前序遍历序和中序遍历序可以唯一确定一棵二叉树。
输入格式
每行输入为一棵非空二叉树的前序遍历序串和中序遍历序串(两串长度均不超过2000),前序遍历序和中序遍历序中间用一个空格隔开。 每个结点为一个字符(字母或数字),且不存在相同结点。
输出格式
对每行输入,输出对应二叉树的后序遍历序后换行
输入样例
abc bac
ab ba
输出样例
bca
ba
代码展示
递归实现
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct BiNode{
char data;
BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;
BiTree pre_mid_build(char* pre,char* mid,int num){
if(pre==NULL||mid==NULL||num<=0)
return NULL;
BiTree root=new BiNode;
root->data=pre[0];
root->lchild=NULL;root->rchild=NULL;
if(num==1) return root;
int left_num=0;//左子树结点总数
char* middle_root=mid;
while(*middle_root!=pre[0]&&middle_root<=(mid+num-1)){
middle_root++;
left_num++;
}
if(left_num>0)//创建左子树
root->lchild=pre_mid_build(pre+1,mid,left_num);
if(num-left_num-1>0)//创建右子树
root->rchild=pre_mid_build(pre+left_num+1,mid+left_num+1,num-left_num-1);
return root;
}
int SucTraverse(BiTree T){//后序遍历
if(T==nullptr) return 0;
SucTraverse(T->lchild);
SucTraverse(T->rchild);
cout<<T->data;
return 0;
}
int DestroyBiTree(BiTree &T){//销毁二叉树
if(T==nullptr) return 0;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T=nullptr;
return 0;
}
int main(){
//freopen("/config/workspace/test/test","r",stdin);
string pre;
string mid;
while(cin>>pre>>mid){
char P[2001];
char M[2001];
for(int i=0;i<pre.length();i++){
P[i]=pre[i];
M[i]=mid[i];
}
BiTree root=pre_mid_build(P,M,pre.length());
SucTraverse(root);
DestroyBiTree(root);
cout<<endl;
}
return 0;
}