zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    MySQL模糊匹配查询like、regexp、in
    MySQL数据库——表操作
    (转)MySQL join语法解析与性能分析
    (转)解决 TortoiseGit 诡异的 Bad file number 问题
    四、windows下TortoiseGit的使用与操作
    (转)创建GitHub技术博客
    二、Windows下TortoiseGit的安装与配置
    三、TortoiseGit之配置密钥
    集训之6-26模拟赛一
    集训之各种dp
  • 原文地址:https://www.cnblogs.com/buhuiflydepig/p/10610829.html
Copyright © 2011-2022 走看看