-
题目描述:
-
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
-
输入:
-
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
-
输出:
-
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
-
样例输入:
-
ABC BAC FDXEAG XDEFAG
-
样例输出:
-
BCA XEDGAF
-
来源:
- 2006年清华大学计算机研究生机试真题
-
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 30 typedef struct TNode { char data; struct TNode *lchild; struct TNode *rchild; }TNode; TNode *CreateTree(char PreOrder[],int PreStart, int PreEnd, char InOrder[], int InStart, int InEnd) { if (PreOrder == NULL || PreStart > PreEnd || InOrder == NULL || InStart > InEnd) { return NULL; } TNode *pRoot = (TNode*)malloc(sizeof(TNode)); pRoot->data = PreOrder[PreStart]; pRoot->lchild = NULL; pRoot->rchild = NULL; //if (PreStart == PreEnd) //无左右子树 //{ // return pRoot; //} int i = InStart; int NumLeft = 0; //左子树的长度 while (InOrder[i] != PreOrder[PreStart]) { ++i; ++NumLeft; } //if(NumLeft > 0) //有左子树 pRoot->lchild = CreateTree(PreOrder, PreStart + 1, PreStart + NumLeft, InOrder, InStart, InStart + NumLeft - 1); //if(InEnd - InStart - NumLeft > 0) //有右子树 pRoot->rchild = CreateTree(PreOrder, PreStart + NumLeft + 1, PreEnd, InOrder, InStart + NumLeft + 1, InEnd); return pRoot; } void PostOrderTraverse(TNode *pRoot) { if (pRoot != NULL) { PostOrderTraverse(pRoot->lchild); PostOrderTraverse(pRoot->rchild); printf("%c", pRoot->data); } } int main() { char PreOrder[MAX]; char InOrder[MAX]; while (scanf("%s%s", PreOrder, InOrder) != EOF) { TNode *pRoot = CreateTree(PreOrder, 0, strlen(PreOrder) - 1, InOrder, 0, strlen(InOrder) - 1); PostOrderTraverse(pRoot); printf("\n"); } return 0; }