问题 A: 复原二叉树
题目描述
小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。
输入
输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。
输出
对于每组输入,输出对应的二叉树的后续遍历结果。
样例输入 Copy
DBACEGF ABCDEFG BCAD CBAD
样例输出 Copy
ACBFGED CDAB
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50;
struct node{
char data;
node* lchild;
node* rchild;
}BiTree;
char pre[maxn], in[maxn];
int n;
/*复原*/
node* restore(int preL, int preR, int inL, int inR){
if(preL>preR){
return NULL;
}
node* root = new node;
root->data = pre[preL];
int k;
for(k=inL; k<maxn; k++){
if(in[k]==pre[preL])
break;
}
int numLdft = k - inL;
root->lchild = restore(preL+1, preL+numLdft, inL, k-1);
root->rchild = restore(preL+numLdft+1, preR, k+1, inR);
return root;
}
/*后序*/
void postorder(node* root){
if(root == NULL){
return;
}
postorder(root->lchild);
postorder(root->rchild);
printf("%c", root->data);
}
int main(){
while(scanf("%s%s", pre, in)!=EOF){
int cont = 0;
for(int i=0; i<maxn; i++){
if(pre[i]>='A'&&pre[i]<='Z')
cont++;
}
node* root = new node;
root = restore(0, cont-1, 0, cont-1);
postorder(root);
printf("\n");
memset(pre, ' ', sizeof(pre));
memset(in, ' ', sizeof(in));
}
return 0;
}