Ⅰ 数据结构算法设计——统计二叉树叶子结点的个数,并输出结果
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatTree(BiTree &A)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
A=NULL;
}
else
{
A=new BiTNode;
A->data=ch;
CreatTree(A->lchild);
CreatTree(A->rchild);
}
}
int NodeTree(BiTree A)
{
if(A==NULL)
return 0;
else if(A->lchild==NULL&&A->rchild==NULL)
return 1;
else
return NodeTree(A->lchild)+NodeTree(A->rchild);
}
int main()
{
BiTree A;
int b;
printf("先序法赋值(空用#表示):");
CreatTree(A);
b=NodeTree(A);
printf("共有%d个叶子节点 ",b);
}
(1)c语言输出叶子结点个数扩展阅读
二叉树的性质
1、对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
2、有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
若I为结点编号则 如果I>1,则其父结点的编号为I/2;
如果2*I<=N,则其左孩子(即左子树的根结点)的编号为2*I;若2*I>N,则无左孩子;
如果2*I+1<=N,则其右孩子的结点编号为2*I+1;若2*I+1>N,则无右孩子。
3、给定N个结点,能构成h(N)种不同的二叉树。h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。
4、设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i[2]
Ⅱ 求查找二叉树子叶(结点)个数的C程序
正好我在做这个作业,我刚写完的,调试过的
为了能在叶子节点返回,我们得多添加叶子节点,使所有的叶子节点都为NULL,他们的直为'?'.
运行该程序,输入ABD??EG???CFH??I?J???+回车
输出leavers=4,deep=5
#include <stdio.h>
#include <stdlib.h>
#define NULLKEY '?'
typedef struct btnode
{
char data;
struct btnode *lchild,*rchild;
}btnode,*bitree;
bitree preCreateBitree(bitree &root)
{
char ch;
scanf("%c",&ch);
if(ch==NULLKEY)
{
root=NULL;
return(root);
}
else
{
root=(bitree)malloc(sizeof(btnode));
root->data=ch;
preCreateBitree(root->lchild);
preCreateBitree(root->rchild);
return(root);
}
}
int searchLeaves(bitree root)
{
if(root==NULL)
return(0);
else
{
printf("%c",root->data); //计算叶子数同时,遍历每个结点的值
if(root->lchild==NULL && root->rchild==NULL)
return(1);
else
return(searchLeaves(root->lchild)+searchLeaves(root->rchild));
}
}
int searchDeep(bitree root)
{
int lDeep=0,rDeep=0;
if(root==NULL)
return(0);
else
{
lDeep=searchDeep(root->lchild);
rDeep=searchDeep(root->rchild);
return(1+((lDeep>rDeep)?lDeep:rDeep));
}
}
void main()
{
int leaves,deep;
bitree root;
root=preCreateBitree(root);
leaves=searchLeaves(root);\\二叉树的叶子数
deep=searchDeep(root);\\二叉树的深度
printf("\nleaves=%d,deep=%d",leaves,deep);
}
Ⅲ c语言 统计二叉树的叶节点个数,并输出每个叶节点到根结点的路径
int countTreeNode(TreeNode * root, Queue *queue)
{
if (root == NULL)
return 0;
queue->push(root);//入队
if (root->left == NULL && root->right == NULL)
{
queue->print();//打印队列中的元素
queue->pop();//出队
return 1;
}
int count = countTreeNode(root->left, queue) + countTreeNode(root->right,queue);
queue->pop();//出队
return count;
}
Ⅳ C语言求树中的叶子结点数
有从上至下和从下至上两种方式可以统计树的节点数。
设叶子节点(度为0的节点)数为x:
从上至下时,度为n的节点有n个子节点,再加上根节点,总结点数量为1+4×1+3×2+2×3+1×4+0×n=21
从下至上时,节点数为度为0~4的所有节点数相加,总节点数量为1+2+3+4+n=10+n
所以有21=10+n,得n=11.
Ⅳ 怎么计算C语言的二叉树中的叶子节点数
结点的度是指,该结点的子树的个数,在二叉树中,不存在度大于2的结点。
计算公式:n0=n2+1
n0
是叶子节点的个数
n2
是度为2的结点的个数
n0=n2+1=5+1=6
故二叉树有5个度为2的结点,则该二叉树中的叶子结点数为6。
(5)c语言输出叶子结点个数扩展阅读
叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。
叶子是指度为0的结点,又称为终端结点。
叶子结点
就是度为0的结点
就是没有子结点的结点。
n0:度为0的结点数,n1:度为1的结点
n2:度为2的结点数。
N是总结点
在二叉树中:
n0=n2+1;
N=n0+n1+n2
参考资料:叶子结点_网络
Ⅵ 按先序遍历输出叶子结点的程序(可以用C++运行的C语言程序)
#include<stdlib.h>
#include<stdio.h>
typedefstructbitnode{
intdate;
structbitnode*lchild,*rchild;
}bitnode,*bitree;
intj=0;
//函数说明
bitree*createbitree(bitree*T);
intQtraversebitree(bitreeT);
intZtraversebitree(bitreeT);
intHtraversebitree(bitreeT);
intFtraversebitree(bitreeT);
/*******************主函数****************************/
main()
{
bitreeTree,*T;intk;
do
{
printf(" ╔-----------------------------------------------╗");//显示一个简易菜单
printf(" ┆先序创建----1先序遍历------2┆");
printf(" ┆中序遍历----3后序遍历------4┆");
printf(" ┆叶子个数---5退出程序------6┆");
printf(" ╚-----------------------------------------------╝ ");
printf("请输入所要进行的操作序号:");
scanf("%d",&k);//接受用户的选择
switch(k)//接受用户的函数
{case1:printf("左右子树为空时用0代替,用间隔符隔开: ");
T=createbitree(&Tree);
break;
case2:Qtraversebitree(*T);
break;
case3:Ztraversebitree(*T);
break;
case4:Htraversebitree(*T);
break;
case5:printf(" 叶子个数为:%d ",Ftraversebitree(*T));
break;
case6:break;
default:printf("错误选择!请重选 ");break;
}
}while(k!=6); //直到i被赋值为6
return0;
}
/*******************创建二叉树函数****************************/
bitree*createbitree(bitree*T)
{
charch;
scanf("%d",&ch);
if(ch==0)
(*T)=NULL;
else{
if(!((*T)=(bitnode*)malloc(sizeof(bitnode))))
exit(0);
(*T)->date=ch;//生成根节点
createbitree(&(*T)->lchild);
createbitree(&(*T)->rchild);
}
returnT;
}
/*******************先序遍历函数****************************/
Qtraversebitree(bitreeT)
{
if(T){printf("%d",T->date);
if(Qtraversebitree(T->lchild))
if(Qtraversebitree(T->rchild))return1;
return0;
}
elsereturn1;
}
/*******************中序遍历函数****************************/
Ztraversebitree(bitreeT)
{
if(T){if(Ztraversebitree(T->lchild))
printf("%d",T->date);
if(Ztraversebitree(T->rchild))return1;
return0;
}
elsereturn1;
}
/*******************后序遍历函数****************************/
Htraversebitree(bitreeT)
{
if(T){if(Htraversebitree(T->lchild))
if(Htraversebitree(T->rchild))
printf("%d",T->date);return1;
return0;
}
elsereturn1;
}
/******************返回叶子节点个数函数*************/
Ftraversebitree(bitreeT)
{
if(T){if(!((T->lchild)||(T->rchild)))j++;
if(Ftraversebitree(T->lchild))
if(Ftraversebitree(T->rchild))returnj;
returnj;
}
elsereturnj;
}