二叉树求叶子数的数学模型是:
三种情况: 第一种, 当a=NULL时, 函数值为0 ;
第二种, 当左子树和右子树都为空时, 返回1
第三种, 排除以上所有的就是两边子树叶子加起来,返回一个和
因此思路就是 第一步 头文件定义部分:包括创建二叉树的函数,前面一篇文章有讲到头文件,一样的。
#include<stdlib.h>
#include<stdio.h>
typedef struct bnode
{
int data;
struct bnode *lchild,* rchild;
}btree;
btree *insert_node(btree *root,int node)
{
btree *newpointer;
btree *currentpointer;
btree *parentpointer;
newpointer=(btree *)malloc(sizeof(btree));
newpointer->data=node;
newpointer->lchild=NULL;
newpointer->rchild=NULL;
if(root==NULL)
return newpointer;
else
{
currentpointer=root;
while(currentpointer!=NULL)
{
parentpointer=currentpointer;
if(currentpointer->data>node)
{
currentpointer=currentpointer->lchild;
}
else
{
currentpointer=currentpointer->rchild;
}
}
if(parentpointer->data>node)
{
parentpointer->lchild=newpointer;
}
else
{
parentpointer->rchild=newpointer;
}
}
return root;
}
btree *create_btree(int data[], int len)
{
int i;
btree *root= NULL;
for(i=0; i<len ; i++)
{
root=insert_node(root, data[i]);
}
return root;
}第二步:创建计算二叉树的函数 ,这里要注意的是,因为是有返回值的,所以定义的时候用int 不用void
int leafs(btree *root)
{
int num1,num2;
if(root==NULL)
return 0;
else
{
if(root->lchild==NULL && root->rchild==NULL)
{
return 1;
}
else
{
num1=leafs(root->lchild);
num2=leafs(root->rchild);
return (num1+num2);
}
}
}第三步: 前序中序后序挑一种把树遍历一遍,这里写的是前序的非递归遍历:
void preorder (btree *root )
{
btree *p, *s[100];
int top=0;
p=root;
while((p!=NULL)&&(top>0))
{
while(p!= NULL){
printf("%d",p->data);
s[++top]=p;
p=p->lchild;
}
p=s[top--];
p=p->rchild;
}
}第四步: 写主函数,调用调用就好了
int main()
{
btree *root=NULL;
int value, index, nodelist[100];
index=0;
scanf("%d",&value);
while(value!=0)
{
nodelist[index]=value;
index++;
scanf("%d",&value);
}
root=create_btree(nodelist,index);
preorder(root);
printf("leafs number is %d :\n",leafs(root));
}
这篇博客探讨了如何在二叉树中计算叶子节点的数量。根据数学模型,存在三种情况:1) 节点为空时,值为0;2) 左右子树同时为空时,返回1;3) 其他情况下,返回左右子树叶子节点之和。主要内容涉及二叉树结构的头文件定义和相关函数的实现。
588

被折叠的 条评论
为什么被折叠?



