#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
typedef char TElemType;
//定义二叉树结构
typedef struct BiNode
{
TElemType data;
struct BiNode* Lchild, * Rchild;//左右孩子指针
}BiNode,*BiTree;
//先序创建二叉树
void CreatBiTree(BiTree& T)
{
TElemType ch;
scanf("%c", &ch);
if (ch == '#')//#代表空格
{
T = NULL;
}
else
{
T = new BiNode;
T->data = ch;//生成根节点
CreatBiTree(T->Lchild);//递归创建左子树
CreatBiTree(T->Rchild);//递归创建右子树
}
}
//先序遍历输出二叉树(根左右)
void PreOrderTraverse(BiTree T)
{
if (T != NULL)
{
printf("%c", T->data);//根
PreOrderTraverse(T->Lchild);//左
PreOrderTraverse(T->Rchild);//右
}
}
//中序遍历输出二叉树(左根右)
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->Lchild);//左
printf("%c", T->data);//根
InOrderTraverse(T->Rchild);//右
}
}
//后序遍历输出二叉树(左右根)
void PostOrderTraverse(BiTree T)
{
if (T)
{
PostOrderTraverse(T->Lchild);
PostOrderTraverse(T->Rchild);
printf("%c", T->data);
}
}
//计算二叉树的节点总数
int NodeCount(BiTree T)
{
if (T == NULL)
{
return 0;
}
else
{
return NodeCount(T->Lchild) + NodeCount(T->Rchild) + 1;
}
}
//计算二叉树的叶子总数
int LeafNode(BiTree T)
{
if (T == NULL)//如果是空树返回0
{
return 0;
}
if (T->Lchild == NULL && T->Rchild==NULL)//如果只有一个结点,即左子树和右子树都是空,则返回1
{
return 1;
}
else
{
return LeafNode(T->Lchild) + LeafNode(T->Rchild);
}
}
void main()
{
BiTree T;
//测试先序遍历输入
printf("先序输入二叉树,以#结束\n");
CreatBiTree(T);
//测试先序遍历输出
printf("先序遍历输出为:\n");
PreOrderTraverse(T);
printf("\n");
//测试中序遍历输出
printf("中序遍历输出为:\n");
InOrderTraverse(T);
printf("\n");
//测试后续遍历输出
printf("后续遍历输出为:\n");
PostOrderTraverse(T);
printf("\n");
//测试计算二叉树的结点总数
int AllNum;
AllNum = NodeCount(T);
printf("二叉树的结点总数为:%d\n", AllNum);
//测试计算二叉树的叶子总数
int LeafNum;
LeafNum = LeafNode(T);
printf("二叉树的叶子总数为%d:\n",LeafNum);
}
运行结果为: