设二叉树采用链式存储结构,试设计一个算法计算一棵给定的二叉树中叶子节点的数目
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*设二叉树采用链式存储结构,试设计一个算法计算一棵给定的二叉树中叶子节点的数目*/
#include
#include
#define MAXSIZE 20
typedef struct node
{
int data;
struct node *lchild,*rchild;
}Bitree;
Bitree *Q[MAXSIZE]; //队列Q用来存放已输入节点的地址
Bitree *Creatree() //建立二叉树,返回根指针
{
char ch;
int front,rear;
Bitree *T,*s;
T=NULL;
front=1;
rear=0;
printf("请输入数的节点:('@'表示虚节点'#'表示结束)\n");
ch=getchar();
while(ch!='#')//如果不是结束符号,则继续执行
{
s=NULL;
if(ch!='@') //如果输入的不是是虚节点,则建立新节点,否则不建立
{
s=(Bitree *)malloc(sizeof(Bitree));
s->data=ch;
s->lchild=s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
T=s;
else
{
if(s!=NULL&&Q[front]!=NULL)
{
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
}
if(rear%2==1) //两个孩子处理完毕,front++
front++;
}
ch=getchar();
}
return T;
}
int countleaf(Bitree *T)
{
if(T==NULL) //如果节点为空,则返回0
return 0;
else if((T->lchild==NULL) && (T->rchild==NULL))//否则如果节点左右孩子有一个为空,另一个存在,则返回1
return 1;
else
return(countleaf(T->lchild)+countleaf(T->rchild));//否则返回左右子树叶子节点之和
}
void main()
{
Bitree *T;
int count;
T=Creatree();
count=countleaf(T);
printf("树的叶子节点个数为:%d\n",count);
}