#include "stdio.h"
#include"malloc.h"
//二叉树节点
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
//这里的*BiTree其实不一定要定义
//定义BiTNode就够了
//在代码中表示树可以这么写:BiTNode *t;
} BiTNode, *BiTree;
//创建一个节点
BiTree Create(BiTree T) {
char ch;
ch = getchar();
if (ch == '#')
T = NULL;
else {
T = (BiTNode *) malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = Create(T->lchild);
T->rchild = Create(T->rchild);
}
return T;
}
//前序遍历
void Preorder(BiTree T) {
if (T) {
printf("%c", T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
//中序遍历
void Inorder(BiTree T) {
if (T) {
Inorder(T->lchild);
printf("%c", T->data);
Inorder(T->rchild);
}
}
//后序遍历
void Post(BiTree T) {
if (T) {
Post(T->lchild);
Post(T->rchild);
printf("%c", T->data);
}
}
//统计节点数
int Sumnode(BiTree T) {
int sum1 = 0, a, b;
if (T) {
if (T != NULL)
sum1++;
a = Sumnode(T->lchild);
sum1 += a;
b = Sumnode(T->rchild);
sum1 += b;
}
return sum1;
}
//统计叶子节点数
int Sumleaf(BiTree T) {
int sum = 0, m, n;
if (T) {
if ((!T->lchild) && (!T->rchild))
sum++;
m = Sumleaf(T->lchild);
sum += m;
n = Sumleaf(T->rchild);
sum += n;
}
return sum;
}
//统计有左右孩子的节点个数
int mnode(BiTree T) {
int sum2 = 0, e, f;
if (T) {
if ((T->lchild != NULL) && (T->rchild != NULL))
sum2++;
e = mnode(T->lchild);
sum2 += e;
f = mnode(T->rchild);
sum2 += f;
}
return sum2;
}
main()
{
BiTNode *T;
int sum,sum1,sum3;
printf("请输入字符串:\n");
T=Create(T);
printf("前序遍历:\n");
Preorder(T);
printf("\n");
printf("中序遍历:\n");
Inorder(T);
printf("\n");
printf("后序遍历:\n");
Post(T);
printf("\n");
sum=Sumleaf(T);
printf("树叶数为:\n");
printf("%d",sum);
printf("\n");
printf("树结点数为:\n");
sum1=Sumnode(T);
printf("\n");
printf("%d",sum1);
printf("\n");
printf("树满结点数为:\n");
sum3=mnode(T);
printf("%d",sum3);
printf("\n");
}