#include<stdio.h>
#include<malloc.h>
#define DataType char
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree *bt)
{
DataType ch;
ch = getchar();
if(ch == '.')
{
*bt = NULL;
}
else
{
*bt = (BiTNode *)malloc(sizeof(BiTNode));
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
void PrePrint(BiTree bt)
{
if(bt == NULL)
{
printf(".");
}
else
{
printf("%c", bt->data);
PrePrint(bt ->LChild);
PrePrint(bt ->RChild);
}
}
void InPrint(BiTree bt)
{
if(bt == NULL)
{
printf(".");
}
else
{
InPrint(bt ->LChild);
printf("%c", bt->data);
InPrint(bt ->RChild);
}
}
void PostPrint(BiTree bt)
{
if(bt == NULL)
{
printf(".");
}
else
{
PostPrint(bt ->LChild);
PostPrint(bt ->RChild);
printf("%c", bt->data);
}
}
void PrintLeaf(BiTree bt)
{
if(bt != NULL)
{
if(bt -> LChild == NULL &&bt -> RChild == NULL)
printf("%c", bt->data);
PrintLeaf(bt -> LChild);
PrintLeaf(bt -> RChild);
}
}
int CountLeaf(BiTree bt)
{
int cnt;
if(bt == NULL)
{
cnt = 0;
}
else if(bt -> LChild == NULL && bt -> RChild == NULL)
{
cnt = 1;
}
else
{
cnt = CountLeaf(bt -> LChild) + CountLeaf(bt -> RChild);
}
return cnt;
}
int PostTreeDepth(BiTree bt)
{
int hl, hr, max;
if(bt == NULL)
{
return 0;
}
else
{
hl = PostTreeDepth(bt ->LChild);
hr = PostTreeDepth(bt ->RChild);
max = hl>hr?hl:hr;
max++;
return max;
}
}
void PrintTree(BiTree Boot, int nLayer)
{
int i;
if(Boot==NULL)
return;
PrintTree(Boot->RChild, nLayer+1);
for(i=0; i<nLayer; i++)
printf(" ");
printf("%c\n", Boot->data);
PrintTree(Boot->LChild, nLayer+1);
}
int main()
{
BiTree bt;
int Leafcnt, depth;
CreateBiTree(&bt);
PrePrint(bt);
printf("\n");
InPrint(bt);
printf("\n");
PostPrint(bt);
printf("\n");
PrintLeaf(bt);
printf("\n");
Leafcnt = CountLeaf(bt);
printf("统计叶子结点数为:%d\n", Leafcnt);
depth = PostTreeDepth(bt);
printf("二叉树高为:%d\n", depth);
PrintTree(bt, 0);
return 0;
}