#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int status;

typedef struct BiNode

...{
char Data;
struct BiNode* lChild;
struct BiNode* rChild;
}BiNode,*pBiNode;

status CreateTree(BiNode** pTree);
status PreOrderTraval(BiNode* pTree);
status Visit(char Data);
status Display(BiNode* pTree,int Level);
status Clear(BiNode* pTree);

BiNode *pRoot=NULL;

main()

...{
clrscr();
CreateTree(&pRoot);

printf(" PreOrder:");
PreOrderTraval(pRoot);
printf(" ");

printf(" InOrder:");
InOrderTraval(pRoot);
printf(" ");

printf(" PostOrder:");
PostOrderTraval(pRoot);
printf(" ");

printf(" ShowLeaves:");
ShowLeaves(pRoot);
printf(" ----------------------- ");
printf(" ");

Display(pRoot,0);

printf(" ");
printf(" Deleting Tree: ");
DelTree(pRoot);
printf("BiTree Deleted.");

getch();
}

status CreateTree(BiNode** pTree) /**//*Input Example: abd##e##cf##g##*/

...{
char ch;
scanf("%c",&ch);
if(ch=='#')

...{
(*pTree)=NULL;
}
else

...{
if(!((*pTree)=(BiNode*)malloc(sizeof(BiNode))))

...{
exit(OVERFLOW);
}
(*pTree)->Data=ch;
CreateTree(&((*pTree)->lChild));
CreateTree(&((*pTree)->rChild));
}
return OK;
}
status PreOrderTraval(BiNode* pTree)

...{
if(pTree)

...{
if(Visit(pTree->Data))

...{
if(PreOrderTraval(pTree->lChild))

...{
if(PreOrderTraval(pTree->rChild))

...{
return OK;
}
}
}
return ERROR;
}
else

...{
return OK;
}
}
status InOrderTraval(BiNode* pTree)

...{
if(pTree)

...{
if(InOrderTraval(pTree->lChild))

...{
if(Visit(pTree->Data))

...{
if(InOrderTraval(pTree->rChild))

...{
return OK;
}
}
return ERROR;
}
return ERROR;
}
else

...{
return OK;
}
}
status PostOrderTraval(BiNode* pTree)

...{
if(pTree)

...{
if(PostOrderTraval(pTree->lChild))

...{
if(PostOrderTraval(pTree->rChild))

...{
if(Visit(pTree->Data))

...{
return OK;
}
return ERROR;
}
}
return ERROR;
}
else

...{
return OK;
}
}
status Visit(char Data)

...{
printf("%c",Data);
return OK;
}
status Display(BiNode* pTree,int Level)

...{
int i;
if(pTree==NULL) return;
Display(pTree->lChild,Level+1);
for(i=0;i<Level-1;i++)

...{
printf(" ");
}
if(Level>=1)

...{
printf("--");
}
printf("%c ",pTree->Data);
Display(pTree->rChild,Level+1);
}
status ShowLeaves(BiNode* pTree)

...{
if(pTree)

...{
if(ShowLeaves(pTree->lChild))

...{
if(ShowLeaves(pTree->rChild))

...{
if((pTree->lChild==NULL)&&(pTree->rChild==NULL))

...{
if(!Visit(pTree->Data))

...{
return ERROR;
}
}
return OK;
}
}
return ERROR;
}
else

...{
return OK;
}
}
status DelTree(BiNode* pTree)

...{
if(pTree)

...{
if(DelTree(pTree->lChild))

...{
if(DelTree(pTree->rChild))

...{
printf("Deleting %c ",pTree->Data);
free((void*)pTree);
return OK;
}
}
return ERROR;
}
else

...{
return OK;
}
}























































































































































































































































