有什么疑问大家评论区提出吧,我直接把整个代码给大家:
#include<stdio.h>
#include<stdlib.h>
typedef struct tree{
char data;
struct tree *lchild,*rchild;
}BiTNode,*BiTree;
void Inittree(BiTree *T) //初始化,下面函数引用的都是二重指针//
{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=NULL;
(*T)->lchild=NULL;
(*T)->rchild=NULL;
}
void creattree(BiTree *T) //先序创建//
{
char ch;
ch=getchar();
if(ch=='#')
{
*T=NULL;
return;
}else{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch;
creattree(&((*T)->lchild));
creattree(&((*T)->rchild));
}
}
int judgetree(BiTree *T) //判断二叉树有几层,先序遍历//
{
int llength,rlength,max;
if((*T)!=NULL)
{
llength=judgetree(&(*T)->lchild);
rlength=judgetree(&(*T)->rchild);
max=llength>rlength?llength:rlength;
return max+1;
}else{
return 0;
}
}
void judgeleaf(BiTree *T,int *leaf) //判断二叉树有几个叶子,先序遍历,这里用一重指针leaf是为了不被递归判断的return leaf所返回为零//
{
if((*T)!=NULL)
{
judgeleaf(&(*T)->lchild,leaf);
judgeleaf(&(*T)->rchild,leaf);
if((*T)->lchild==NULL&&(*T)->rchild==NULL)
{
(*leaf)++;
}
}
}
void printleaf(BiTree *T) //输出叶子节点,思路和判断有几个叶子节点是一样的//
{
if((*T)!=NULL)
{
printleaf(&(*T)->lchild);
printleaf(&(*T)->rchild);
if((*T)->lchild==NULL&&(*T)->rchild==NULL)
printf("%c",(*T)->data);
}
}
void visit(char a) //输出函数//
{
printf("%c",a);
}
void proprinttree(BiTree *T) //先序输出//
{
if(*T!=NULL)
{
visit((*T)->data);
proprinttree(&(*T)->lchild);
proprinttree(&(*T)->rchild);
}
}
void midprinttree(BiTree *T) //中序输出//
{
if(*T!=NULL)
{
midprinttree(&(*T)->lchild);
visit((*T)->data);
midprinttree(&(*T)->rchild);
}
}
void lastprinttree(BiTree *T) //后序输出//
{
if(*T!=NULL)
{
lastprinttree(&(*T)->lchild);
lastprinttree(&(*T)->rchild);
visit((*T)->data);
}
}
int main()
{
int leaf=0; //定义叶子初始化为零//
BiTNode *T; //定义根//
Inittree(&T);
printf("请按照先序序列输入二叉树:\n");
creattree(&T);
printf("此二叉树有%d层\n",judgetree(&T));
judgeleaf(&T,&leaf);
printf("此二叉树的叶子有%d个:\n",leaf);
printf("叶子节点分别是:\n");
printleaf(&T);
printf("\n");
printf("按照先序输出二叉树:\n");
proprinttree(&T);
printf("\n");
printf("按照中序输出二叉树:\n");
midprinttree(&T);
printf("\n");
printf("按照后序输出二叉树:\n");
lastprinttree(&T);
printf("\n");
return 0;
}