直接上代码!
#include<stdio.h>
#include<malloc.h>
#define yes 1
#define no 0
typedef char ElemType;
typedef struct node{
ElemType data;
struct node *lchild,*rchild;
}BinTree;
BinTree* CreateBTree() //创建二叉树,返回二叉树的根节点指针
{
BinTree *bt = NULL;
char ch;
ch = getchar();
if(ch!='#'){
bt = (BinTree*)malloc(sizeof(BinTree));
bt->data = ch;
bt->lchild = CreateBTree();
bt->rchild = CreateBTree();
}
return bt;
}
int Depth(BinTree *bt) //求二叉树深度
{
int hl,hr;
if(!bt)
return 0;
else{
hl = Depth(bt->lchild);
hr = Depth(bt->rchild);
if(hl>=hr)
return hl + 1;
else
return hr + 1;
}
}
void CountLeaf(BinTree *bt,int *count) //统计二叉树共有几个叶子结点
{
if(bt){
if((bt->lchild==NULL)&&(bt->rchild==NULL))
*count = *count + 1;
CountLeaf(bt->lchild,count);
CountLeaf(bt->rchild,count);
}
}
int NumLeaf(BinTree *bt) //统计二叉树共有几个叶子结点
{
if(bt == NULL)
return 0;
if(!bt->lchild&&!bt->rchild)
return 1;
return NumLeaf(bt->lchild) + NumLeaf(bt->rchild);
}
int NumNode(BinTree *bt) //统计二叉树共有几个结点
{
if(bt==NULL)
return 0;
return 1 + NumNode(bt->lchild) + NumNode(bt->rchild);
}
void FrontOrder(BinTree *bt) //先序遍历二叉树
{
if(bt){
printf("%c",bt->data);
FrontOrder(bt->lchild);
FrontOrder(bt->rchild);
}
}
void MiddleOrder(BinTree *bt) //中序遍历二叉树
{
if(bt){
MiddleOrder(bt->lchild);
printf("%c",bt->data);
MiddleOrder(bt->rchild);
}
}
void PostOrder(BinTree *bt) //后序遍历二叉树
{
if(bt){
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%c",bt->data);
}
}
int main()
{
BinTree *bt;
bt = CreateBTree();
int count = 0;
//CountLeaf(bt,&count);
//printf("%d\n",NumNode(bt));
FrontOrder(bt);
printf("\n");
MiddleOrder(bt);
printf("\n");
PostOrder(bt);
printf("\n");
return 0;
}
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct BinTree{
ElemType data;
struct BinTree *lchild,*rchild;
}BinTree;
BinTree* CreateBTree()
{
BinTree *bt;
bt = (BinTree*)malloc(sizeof(BinTree));
char ch;
scanf("%c",&ch);
if(ch!='#'){
bt->data = ch;
bt->lchild = CreateBTree();
bt->rchild = CreateBTree();
}
else
bt = NULL;
return bt;
}
void FrontTree(BinTree *bt)
{
if(bt){
printf("%3c",bt->data);
FrontTree(bt->lchild);
FrontTree(bt->rchild);
}
}
void MiddleTree(BinTree *bt)
{
if(bt){
MiddleTree(bt->lchild);
printf("%3c",bt->data);
MiddleTree(bt->rchild);
}
}
void PostTree(BinTree *bt)
{
if(bt){
PostTree(bt->lchild);
PostTree(bt->rchild);
printf("%3c",bt->data);
}
}
void CountLeaf(BinTree *bt,int *num)
{
if(bt){
if(!bt->lchild&&!bt->rchild)
*num = *num + 1;
CountLeaf(bt->lchild,num);
CountLeaf(bt->rchild,num);
}
}
int CountLLeaf(BinTree *bt)
{
if(!bt)
return 0;
if(!bt->lchild&&!bt->rchild)
return 1;
return CountLLeaf(bt->lchild) + CountLLeaf(bt->rchild);
}
int DepthBTree(BinTree *bt)
{
int nl,nr;
if(!bt)
return 0;
else{
nl = DepthBTree(bt->lchild);
nr = DepthBTree(bt->rchild);
if(nl>=nr)
return nl + 1;
else
return nr + 1;
}
}
int CountNode(BinTree *bt)
{
if(!bt)
return 0;
return 1 + CountNode(bt->lchild) + CountNode(bt->rchild);
}
int main()
{
int num = 0;
BinTree *bt;
bt = CreateBTree();
printf("\n先序遍历:\n");
FrontTree(bt);
printf("\n中序遍历:\n");
MiddleTree(bt);
printf("\n后序遍历:\n");
PostTree(bt);
printf("\n");
CountLeaf(bt,&num);
printf("[方法一]叶子结点个数为:%d\n",num);
printf("[方法二]叶子结点个数为:%d\n",CountLLeaf(bt));
printf("二叉树共有%d个结点\n",CountNode(bt));
printf("二叉树深度为:%d\n",DepthBTree(bt));
return 0;
}