PTA 重构二叉树

重构二叉树 (25 分)

给出两个字符串,分别表示二叉树的先序遍历(根、左子树、右子树)和中序遍历(左子树、根、右子树)的结果。
例如,对于下面的二叉树,先序遍历结果是DBACEGF,中序遍历结果是ABCDEFG。

假定二叉树的每个节点都用大写的字母标识,且对于同一棵二叉树,同一个字母不会用两次。现在请你根据给出的先序遍历和中序遍历,重构这棵二叉树。

输入格式:

输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。

输出格式:

将每个测试用例转化为一棵二叉树,并在一行中输出树的后序遍历(左子树、右子树、根)的结果。

输入样例:

DBACEGF ABCDEFG
BCAD CBAD

输出样例:

ACBFGED
CDAB

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>

using namespace std;

typedef struct node
{
    char data;
    struct node *lchild,*rchild;
}Tree;

char a[30],b[30];

Tree *CreatTree(char *a,char *b,int r)        //定义返回指针地址的函数
{
        Tree *T;
        for(int i=0;i<r;i++)
            if(a[0]==b[i])
            {
                T=(Tree*)malloc(sizeof(Tree));        //记住要为新定义的指针开辟空间...
                T->data=a[0];                        
                T->lchild=CreatTree(a+1,b,i);        //因为是左子树,所以第一个参数根节点的地址加1就行
                                                    //第二个参数的首地址不用变还是原来位置
                                                    //第三个参数就要发生改变了,长度就变成了在中序遍历数组中所找到的根节点的位置

                T->rchild=CreatTree(a+i+1,b+i+1,r-i-1);            //同理,因为是右子树,所以第一个参数根节点还要多加个i
                                                                //第二个参数同上,首地址位置发生改变
                                                                //第三个参数就是当前的长度减去左子树的长度,再加上当前根节点,所以要多减个1

                return T;                        //记住一点要返回指针的地址...切记切记
            }
    return NULL;    //当前节点为空的时候返回NULL
}

void PrintTree(Tree *T)                //后序遍历输出此树
{
    if(!T)
        return;
    PrintTree(T->lchild);
    PrintTree(T->rchild);
    printf("%c",T->data);
}

int main()
{
    while(cin>>a>>b)
    {
        Tree *T;
        T=CreatTree(a,b,strlen(b));        //第一个参数是根节点的地址
        PrintTree(T);                    //第二个参数是中序遍历数组的地址
        printf("
");                    //第三个参数是中序遍历数组的长度
    }
    return 0;
}
原文地址:https://www.cnblogs.com/buhuiflydepig/p/10610829.html