#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BinaryTreeNode{
ElemType data;
struct BinaryTreeNode *lChild, *rChild;
}BinaryTreeNode;
typedef BinaryTreeNode* BiTree;
void PreCreateBt(BiTree &t)//先序创建二叉树
{
char ch;
ch=getchar();
if(ch=='#')//输入为#表示这里建立空二叉树,即遍历算法的空操作
{
t=NULL;
}
else
{
t=(BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
t->data=ch; //构造根节点
PreCreateBt(t->lChild); //构造左子树
PreCreateBt(t->rChild); //构造右子树
}
// return t;
}
void PreOrderTransverse(BiTree t)//先序遍历
{
if(t==NULL)
return ;
printf("%c",t->data);//打印输出根节点
PreOrderTransverse(t->lChild);// 然后先序遍历左子树
PreOrderTransverse(t->rChild);//然后先序遍历右子树
}
void InOrderTransverse(BiTree t) //中序
{
if(t==NULL)
return;
InOrderTransverse(t->lChild);
printf("%c",t->data);
InOrderTransverse(t->rChild);
}
void PostOrderTransverse(BiTree t) //后序
{
if(t==NULL)
return;
PostOrderTransverse(t->lChild);
PostOrderTransverse(t->rChild);
printf("%c",t->data);
}
int LeafCount(BiTree t)
{
if(t==NULL)
return 0;
if(t->lChild==NULL&&t->rChild==NULL)
{
return 1;
}
else
{
return LeafCount(t->lChild)+LeafCount(t->rChild);
}
}
int CountAll(BiTree t)
{
if(t==NULL)
return 0;
return CountAll(t->lChild)+CountAll(t->rChild)+1;
}
int Depth(BiTree t)
{
if(t==NULL)
return 0;
else
{
int depthLeft=Depth(t->lChild), depthRight=Depth(t->rChild);
return 1+(depthLeft>depthRight?depthLeft:depthRight);
}
}
int Degree(BiTree t)
{
if(t==NULL)
return 0;
if(t->lChild!=NULL&&t->rChild!=NULL)
{
return 1+Degree(t->lChild)+Degree(t->rChild);
}
}
int main()
{
BiTree t;
printf("请输入相应数据:\n");
PreCreateBt(t);
printf("先序遍历:\n");
PreOrderTransverse(t);
printf("\n中序遍历:\n");
InOrderTransverse(t);
printf("\n后序遍历:\n");
PostOrderTransverse(t);
printf("\n叶子结点的个数:\n");
printf("%d",LeafCount(t));
printf("\n结点总数:\n");
printf("%d",CountAll(t));
printf("\n二叉树深度:\n");
printf("%d",Depth(t));
printf("\n度为2的结点数:\n");
printf("%d",Degree(t));
return 0;
}