#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);
}
根据前序遍历和中序遍历建立二叉树,并后序遍历输出以及交换左右子树后输出,请修改下面代码
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- qq_45506907 2020-04-19 02:59关注
改好了:
#include
#include
#include
#define maxsize 50typedef 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