#include<stdio.h>
#include<stdlib.h>
#define ElemType char
#define MAX_SIZE 100
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree PreInCreate(ElemType A[],ElemType B[],int l1,int h1,int l2,int h2){
//l1为先序的第一和最后一个节点下标,l2,h2为中序的第一和最后一个节点的下标
//初始调用时,l1=l2=1;h1=h2=n;
BiTree root=NULL;
root=(BiTNode *)malloc(sizeof(BiTNode));//建根结点
/*指针和引用在被作为参数传递时的区别是:
前者通过对地址的操作进而改变实参
后者是以别名的方式对实参的直接处理达到同样效果。
两者的共同点就是,当实参传进来时,都能改变实参的值*/
root->data=A[l1];
int i;
for(i=l2;B[i]!=root->data;i++);
int llen=i-l2; //左子树长度
int rlen=h2-i; //右子树长度
if(llen){ //递归建立左子树
root->lchild=PreInCreate(A,B,l1+1,l1+llen,l2,l2+llen-1);
}
else{
root->lchild=NULL;
}
if(rlen){
root->rchild=PreInCreate(A,B,h1-rlen+1,h1,h2-rlen+1,h2);
}
else{
root->rchild=NULL;
}
return root;
}
void Visit(BiTree T){
printf("%c\t",T->data);
}
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
void PreOrder(BiTree T){
if(T!=NULL){
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
int main(){
BiTree Tree=NULL;
ElemType A[16];
ElemType B[16];
int i;
char ch;
int ca=0;
int cb=0;
B[0]='#';
A[0]='#';
//getchar() 不论是空格还是换行,都被当作字符接收 所以输入时不要加空格
// ABDHIEGKCFLMGNPHDIBGEKALFMCNGP
for(i=1;i<=15;i++){
ch=getchar();
A[i]=ch;
ca++;
}
for(i=1;i<=15;i++){
ch=getchar();
B[i]=ch;
cb++;
}
// ABDHIEGKCFLMGNP
// HDIBGEKALFMCNGP
// for(i=1;i<=15;i++){
// printf("%c\t",A[i]);
// }
// printf("%d\t",ca);
// for(i=1;i<=15;i++){
// printf("%c\t",B[i]);
// }
// printf("%d\t",cb);
Tree=PreInCreate(A,B,1,ca,1,cb);
PreOrder(Tree);
printf("\n");
InOrder(Tree);
printf("\n");
PostOrder(Tree);
return 0;
}
//scanf是格式化输入的函数,在大多数格式字符处理时,scanf会忽略回车,
//要读取回车,只有使用%c的格式
//%c格式,对应变量为char型,功能为读取一个字符,并存入到对应的字符变量中
//循环读取字符,知道遇到回车结束
//ABDHIEGKCFLMGNP HDIBGEKALFMCNGP
for(i=1;i<=MAX_SIZE;i++){
scanf("%c",&ch);
if(ch!='\n'){
A[i]=ch;
ca++;
}
else{
break;
}
}
for(i=1;i<=MAX_SIZE;i++){
scanf("%c",&ch);
if(ch!='\n'){
B[i]=ch;
cb++;
}
else{
break;
}
}
//或者使用字符串输入
scanf("%s",A);
scanf("%s",B);
ca=strlen(A);
cb=strlen(B);
for(int i=ca;i>=1;i--){
A[i]=A[i-1];
}
for(int i=cb;i>=1;i--){
B[i]=B[i-1];
}