有什么疑问大家评论区提出吧,我直接把整个代码给大家:
#include#include 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; }



