2009西电计算机研究生复试上机题(2)

时间:2020-12-17 06:37:27

题目描述

已知某二叉树的先序序列和中序序列,编程计算并输出该二叉树的后序序列。

 
输入 有多组数据,每组分为两行输入,第一行表示指定二叉树的先序序列,第二行表示该二叉树的中序序列,序列元素均为大写英文字符,表示二叉树的结点。

 
输出

对于每组数组,在一行上输出该二叉树的后序序列。

 
样例输入
ABDGCEFH
DGBAECHF
 
样例输出
GDBEHFCA
 
提示 [+]

*** 提示已隐藏,点击上方 [+] 可显示 ***

 
来源

2009年西电计算机研究生复试上机题

 
这道题是考先序 中序 求后序。如果看后序 中序 求先序 看我的博文: 点击打开链接

/********************************* 
* 日期:2013-3-11
* 作者:SJF0115
* 题号: 天勤OJ 题目1218: Problem D
* 来源:http://acmclub.com/problem.php?id=1218
* 结果:AC
* 来源:2009年西电计算机研究生复试上机题
* 总结:
**********************************/
#include<stdio.h>
#include<string.h>
#include<malloc.h>

//二叉树结点
typedef struct BiTNode{
//数据
char data;
//左右孩子指针
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

/*
PreIndex: 前序序列字符串中子树的第一个节点在PreArray[]中的下标
InIndex: 中序序列字符串中子树的第一个节点在InArray[]中的下标
subTreeLen: 子树的字符串序列的长度
PreArray: 先序序列数组
InArray:中序序列数组
*/


char PreArray[101],InArray[101];

void PreInCreateTree(BiTree &T,int PreIndex,int InIndex,int subTreeLen){
//subTreeLen < 0 子树为空
if(subTreeLen <= 0){
T = NULL;
return;
}
else{
T = (BiTree)malloc(sizeof(BiTNode));
//创建根节点
T->data = PreArray[PreIndex];
//找到该节点在中序序列中的位置
int index = strchr(InArray,PreArray[PreIndex]) - InArray;
//左子树结点个数
int LenF = index - InIndex;
//创建左子树
PreInCreateTree(T->lchild,PreIndex + 1,InIndex,LenF);
//右子树结点个数(总结点 - 根节点 - 左子树结点)
int LenR = subTreeLen - 1 - LenF;
//创建右子树
PreInCreateTree(T->rchild,PreIndex + LenF + 1,index + 1,LenR);
}
}

//后序遍历
void PostOrder(BiTree T){
if(T != NULL){
//访问左子结点
PostOrder(T->lchild);
//访问右子结点
PostOrder(T->rchild);
//访问根节点
printf("%c",T->data);
}
}

int main(){
while(scanf("%s %s",PreArray,InArray) != EOF){
BiTree T;
PreInCreateTree(T,0,0,strlen(InArray));
PostOrder(T);
printf("\n");
}
}