已知某二叉树的先序序列和中序序列,编程计算并输出该二叉树的后序序列。
对于每组数组,在一行上输出该二叉树的后序序列。
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"); } }