#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node * lchild;
struct node * rchild;
}BTNode;
//创建二叉树
void CreateBTNode(BTNode * & b,ElemType * str)
{
BTNode * St[MaxSize],* p=NULL;
int top=-1,k,j=0;
ElemType ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':
top++;
St[top]=p;
k=1;
break;
case ')':
top--;
break;
case ',':
k=2;
break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
{
b=p;
}
else
{
switch(k)
{
case 1:St[top]->lchild=p;
break;
case 2:St[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
}
}
//输出二叉树
void DisplayBTNode(BTNode * b)
{
if(b!=NULL)
{
printf("%c ",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{
printf("(");
DisplayBTNode(b->lchild);
if(b->rchild!=NULL)
{
printf(",");
}
DisplayBTNode(b->rchild);
printf(")");
}
}
}
//求二叉树的高度
int BTNodeDepth(BTNode * b)
{
int lchild,rchild;
if(b==NULL)
{
return 0;
}
else
{
lchild=BTNodeDepth(b->lchild);
rchild=BTNodeDepth(b->rchild);
return
(lchild>rchild?(lchild+1):(rchild+1));
}
}
//输出叶子节点
void DisplayLeafNode(BTNode * b)
{
if(b!=NULL)
{
if(b->lchild==NULL&&b->rchild==NULL)
{
printf("%c ",b->data);
}
DisplayLeafNode(b->lchild);
DisplayLeafNode(b->rchild);
}
}
//叶子节点数目
int LeafCount(BTNode * b)
{
if(b!=NULL)
{
if(b->lchild==NULL&&b->rchild==NULL)
{
return 1;
}
else return LeafCount(b->lchild)+LeafCount(b->rchild);
}
return 0;
}
void main()
{
BTNode *b;
CreateBTNode(b,"A(B(D(,H),E(I,J)),C(F(K),G))");
printf("二叉树的输出:\n");
DisplayBTNode(b);
printf("\n");
printf("二叉树的高度为:\n");
printf("%d \n",BTNodeDepth(b));
printf("输出叶子节点:\n");
DisplayLeafNode(b);
printf("\n");
printf("叶子节点的数目为:\n");
printf("%d \n",LeafCount(b));
}