ARookie1234 2020-04-16 19:13 采纳率: 100%
浏览 730
已采纳

根据前序遍历和中序遍历建立二叉树,并后序遍历输出以及交换左右子树后输出,请修改下面代码

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define maxsize 50

typedef struct Bnode
{
    char data;
    struct Bnode *Lchild, *Rchild;
}BTnode, *BTptr;

BTptr CreateBT(char *pre_str, char *in_str)
{
    BTptr bt;
    bt=(BTptr)malloc(sizeof(BTnode));
    bt->data=pre_str[0];
    bt->Lchild=NULL;
    bt->Rchild=NULL;
    if(strlen(pre_str)==1)
        return bt;
    else
    {
        char pre_left[maxsize];
        char in_left[maxsize];
        char pre_right[maxsize];
        char in_right[maxsize];
        int i=0, j=0;
        while(in_str[i]!=bt->data)
        {
            pre_left[i]=pre_str[i+1];
            in_left[i]=in_str[i];
            i++;
        }
        pre_left[i]='\0';
        in_left[i]='\0';
        while(i<=strlen(in_str))
        {
            pre_right[j]=pre_str[i];
            in_right[j]=in_str[i+1];
            i++;j++;
        }
        pre_right[j]='\0';
        in_right[j]='\0';
        if(strlen(pre_left)!=strlen(in_left) || strlen(pre_right)!=strlen(in_right))
        {
            printf("Error\n");
            return 0;
        }
        bt->Lchild=CreateBT(pre_left, in_left);
        bt->Rchild=CreateBT(pre_right, in_right);
        return bt;
    }
}

BTptr Judge(char *pre_str, char *in_str)
{
    if(pre_str==NULL || in_str==NULL || strlen(pre_str)!=strlen(in_str))
        return 0;
    else
        return CreateBT(pre_str, in_str);
}

void PreExchange(BTptr T)
{
    BTptr p;
    if(T!=NULL)
    {
        p=T->Lchild;
        T->Lchild=T->Rchild;
        T->Rchild=p;
        PreExchange(T->Lchild);
        PreExchange(T->Rchild);
    }
}

void PostOrderBT(BTptr T)
{
    if(T!=NULL)
    {
        PostOrderBT(T->Lchild);
        PostOrderBT(T->Rchild);
        printf("%c",T->data);
    }
}

void main()
{
    char pre_str[maxsize];
    char in_str[maxsize];
    gets(pre_str);
    gets(in_str);
    BTptr bt;
    bt=Judge(pre_str, in_str);
    PostOrderBT(bt);
    printf("\n");
    PreExchange(bt);
    PostOrderBT(bt);
}
  • 写回答

1条回答 默认 最新

  • qq_45506907 2020-04-19 02:59
    关注

    改好了:
    #include
    #include
    #include
    #define maxsize 50

    typedef struct Bnode
    {
    char data;
    struct Bnode *Lchild, *Rchild;
    }BTnode, *BTptr;

    BTptr CreateBT(char *pre_str, char *in_str)
    {
    BTptr bt;
    bt=(BTptr)malloc(sizeof(BTnode));
    bt->data=pre_str[0];
    bt->Lchild=NULL;
    bt->Rchild=NULL;
    if(strlen(pre_str)==0)
    return bt;

    if(strlen(pre_str)==1)
        return bt;
    else
    {
        char pre_left[maxsize];
        char in_left[maxsize];
        char pre_right[maxsize];
        char in_right[maxsize];
        int i=0, j=0;
        while(in_str[i]!=bt->data)
        {
            pre_left[i]=pre_str[i+1];
            in_left[i]=in_str[i];
            i++;
        }
        pre_left[i]='\0';
        in_left[i]='\0';
    
        while(i<(int)strlen(in_str))//动了下
        {
            pre_right[j]=pre_str[i+1];//[i]改为[i+1]
            in_right[j]=in_str[i+1];
            i++;j++;
        }
        pre_right[j]='\0';
        in_right[j]='\0';
        if(strlen(pre_left)!=strlen(in_left) || strlen(pre_right)!=strlen(in_right))
        {
            printf("Error\n");
            return 0;
        }
        bt->Lchild=CreateBT(pre_left, in_left);
        bt->Rchild=CreateBT(pre_right, in_right);
        return bt;
    }
    

    }

    BTptr Judge(char *pre_str, char *in_str)
    {
    if(pre_str==NULL || in_str==NULL || strlen(pre_str)!=strlen(in_str))
    return 0;
    else
    return CreateBT(pre_str, in_str);
    }

    void PreExchange(BTptr T)
    {
    BTptr p;
    if(T!=NULL)
    {
    p=T->Lchild;
    T->Lchild=T->Rchild;
    T->Rchild=p;
    PreExchange(T->Lchild);
    PreExchange(T->Rchild);
    }
    }

    void PostOrderBT(BTptr T)
    {
    if(T!=NULL)
    {
    PostOrderBT(T->Lchild);
    PostOrderBT(T->Rchild);
    printf("%c",T->data);
    }
    }

    void main()
    {
    char pre_str[maxsize];
    char in_str[maxsize];
    gets(pre_str);
    gets(in_str);
    BTptr bt;
    bt=Judge(pre_str, in_str);
    PostOrderBT(bt);
    printf("\n");
    PreExchange(bt);
    PostOrderBT(bt);
    }图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python