æç»ä½ ä¸ä»½äºåæ 代ç ï¼ä½ æcharåæ¹æ模æ¿ç±»å°±å¯ä»¥äº
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"string.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define TElemType char
char a[20],b[20]; // aåæ¾å
åºåºåï¼båæ¾ä¸åºåºå
//- - - - -äºåæ çäºåé¾è¡¨åå¨è¡¨ç¤º- - - - -
typedef struct BiTNode
{ TElemType data;
struct BiTNode *lchild, *rchild; //å·¦å³å©åæé
} BiTNode, *BiTree;
Status (* VisitFunc)(TElemType v); // å½æ°æé
Status Visit(TElemType v);//访é®å½æ°
Status CreatBiTree(BiTree &T);//ç±å
åºåºåå建äºåæ
void CreateBiTree(int start1,int start2,int len,BiTree &T);//ç±å
åºåºååä¸åºåºå建ç«äºåæ
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e));//å
åºéåäºåæ
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e));//ä¸åºéåäºåæ
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e));//ååºéåäºåæ
//å¾6.8(b) p127
char Vexch[15]={'a','b','c','$','$','d','e','$','g','$','$','f','$','$','$'};
int i=0;
int pre=0 , flag=1;
void main()
{
BiTree T;
int cord;
int n0=0,n1=0,n2=0,n=0;
do{
printf("\n");
printf("1 GreatBiTree ç®æ³6.4 \n\n");
printf("2 ç±å
åºåä¸åºåºåå建äºåæ \n\n");
printf("3 å
åºéåè¾åºï¼ ç®æ³6.1 \n\n");
printf("4 ä¸åºéåè¾åºï¼ \n\n");
printf("5 ååºéåè¾åºï¼ \n\n");
printf("6 Exit Program \n\n");
printf("-----------------------\n\n");
printf("Input Select(1,2,3,4,...)");
scanf("%d",&cord);
switch(cord)
{case 1:
i=0;
CreatBiTree(T);
break;
case 2:
int len;
printf("Please input preorder:\n");
getchar();
gets(a); //è¾å
¥å
åºåºå
printf("Please input inorder:\n");
gets(b); //è¾å
¥ä¸åºåºå
len=strlen(a);
CreateBiTree(0,0,len,T);
break;
case 3:{
printf("å
åºéåè¾åºï¼\n");
PreOrderTraverse(T, Visit);
printf("\n");
}break;
case 4:{
printf("ä¸åºéåè¾åºï¼\n");
InOrderTraverse(T, Visit);
printf("\n");
}break;
case 5:
printf("ååºéåè¾åºï¼\n");
PostOrderTraverse(T,Visit);
printf("\n");
break;
case 6:
exit(0);
}
}while(cord<=50);
}
////////////////////////////////////////////////////////////////
Status CreatBiTree(BiTree &T)
{ //æå
åºæ¬¡åºè¾å
¥äºåæ ä¸ç»ç¹çå¼(ä¸ä¸ªå符),ç©ºæ ¼å符表示空æ ,
//printf("Input char");
//scanf("%c",&ch); //æé äºåé¾è¡¨è¡¨ç¤ºçäºåæ T
//getchar();
///ææp127 å¾6.8 (b)
if(Vexch[i] =='$')
T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=Vexch[i];
++i;//çææ ¹ç»ç¹
CreatBiTree(T->lchild); //æé å·¦åæ
++i;
CreatBiTree(T->rchild); //æé å³åæ
}
return OK;
}//GreatBiTree
///////////////////////////////////////////////////////////////////////
//ç±å
åºåºååä¸åºåºå建ç«äºåæ
//start1æ¯å
åºåºåçèµ·å§ä½ç½®ï¼start2æ¯ä¸åºåºåçèµ·å§ä½ç½®ï¼
//lenæ¯å
åºåºåé¿åº¦
void CreateBiTree(int start1,int start2,int len,BiTree &T)
{
int pos,len1;
if (len<=0) T=NULL;
else
{ pos=start2; //è®°å½ä¸åºåºå串çä½ç½®
while(b[pos]!=a[start1]) pos++; //åªè¦å¨ä¸åºåºå串ä¸æ²¡ææ¾å°æ ¹ï¼é£ä¹å°±å继ç»åå寻æ¾
T=(BiTree)malloc(sizeof(BiTNode));//å¨ä¸åºåºåä¸æ¾å°æ ¹ï¼å¼è¾æ ¹ç»ç¹ç空é´
T->data=a[start1]; //æ ¹çå¼ä¸ºå
åºåºåç第ä¸ä¸ªå
ç´
len1=pos-start2; //ä¸åºåºåæ ¹å·¦ååºå³å·¦åæ çé¿åº¦
CreateBiTree(start1+1,start2,len1,T->lchild); //建ç«å·¦åæ
CreateBiTree(start1+len1+1,pos+1,len-len1-1,T->rchild); //建ç«å³åæ
}
}
///////////////////////////////////////////////////////////////////////
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e))
{ //éç¨äºåé¾è¡¨åå¨ç»æï¼Visitæ¯å¯¹æ°æ®å
ç´ æä½çåºç¨å½æ°,
//å
åºåéäºåæ Tçéå½ç®æ³ï¼å¯¹æ¯ä¸ªæ°æ®å
ç´ è°ç¨å½æ°Visitã
if (T) //äºåæ ä¸ç©º
{
if (Visit(T->data) )
{
if (PreOrderTraverse(T->lchild,Visit) ) //éåå·¦åæ
{
if ( PreOrderTraverse(T->rchild,Visit) ) //éåå³åæ
return OK;
}
}
else
return ERROR; //éåå·¦æå³åæ ä¸æå
} else return OK;
}//PreOrderTraverse
//////////////////////////////////////////////////////////////////////
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e))
{ //ä¸åºåéäºåæ Tçéå½ç®æ³ï¼å¯¹æ¯ä¸ªæ°æ®å
ç´ è°ç¨å½æ°Visitã
if (T)
{
if (InOrderTraverse(T->lchild,Visit) ) //éåå·¦åæ
{
if (Visit(T->data) )
if ( InOrderTraverse(T->rchild,Visit) ) //éåå³åæ
return OK;
}
else
return ERROR;
}
else
return OK;
}//InOrderTraverse
/////////////////////////////////////////////////////////////////
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e))
{ //ååºåéäºåæ Tçéå½ç®æ³ï¼å¯¹æ¯ä¸ªæ°æ®å
ç´ è°ç¨å½æ°Visitã
if (T)
{
if(PostOrderTraverse(T->lchild,Visit) )//éåå·¦åæ
{
if ( PostOrderTraverse(T->rchild,Visit) )//éåå³åæ
if (Visit(T->data) )return OK;
}
else return ERROR;
}
else return OK;
}//InOrderTraverse
///////////////////////////////////////////////////////////////////////
Status Visit(TElemType v)
{
printf("%c ",v);
return OK;
}
温馨提示:答案为网友推荐,仅供参考