导航:首页 > 源码编译 > 统计二叉树分支结点数量算法

统计二叉树分支结点数量算法

发布时间:2022-09-13 17:50:24

① 设计一个算法,统计一棵二叉树中所有叶节点的数目及非叶结点的数目

void Count( BiTree bt,int *m ,*n )//叶子结点数 m,非叶子结点数n
{
if ( bt)
{
if ( bt->lchild==null &&bt->rchild==null )
*m++;//叶子结点
else *n++; //非叶结点
Count( bt->lchild ,&m ,&n );
Count( bt->rchild ,&m ,&n );
}
}//结束 Count

② 编一算法,计算二叉树所有节点数。

递归方法
树的节点个数=左孩子节点个数+右孩子节点个数+1
树为空:结点个数为0
int
Treenodes(BiTree
T)

{

int
num1,num2;

if(T==NULL)
//树为空

return(0);

num1=Treenodes(T->lchild);

num2=Treenodes(T->rchild);

return(num2+num1+1);//左孩子+右孩子节点个数+1

}

③ 如何统计一个二叉树每一层的节点个数请写出算法代码急。。。

//广搜实现
//nod[i]存储的是第i层的结点数
// 输入n为结点数, 接下来n-1条边,每一行x,y表示x,y 之间有边相连。

#include<stdio.h>

#define maxn 100001

long n,o=0;

struct ind
{
long l,nex;
};
struct ind lis[maxn];

long hed[maxn],que[maxn],vis[maxn];

long cot[maxn],nod[maxn];

void Bfs(void)
{
long i,s=0,t=1; que[1]=1; vis[1]=1; cot[1]=1; nod[1]=1;

while(s<t)
{
s++;

for(i=hed[que[s]]; i ;i=lis[i].nex) if(!vis[lis[i].l])
{
que[++t]=lis[i].l; vis[lis[i].l]=1;

cot[t]=cot[s]+1; nod[cot[t]]++;
}
}

}

void Init(void)
{
long i,j,x,y; scanf("%ld",&n);

for(i=1; i<n; i++)
{
scanf("%ld%ld",&x,&y);

lis[++o].l=y; lis[o].nex=hed[x]; hed[x]=o;

lis[++o].l=x; lis[o].nex=hed[y]; hed[y]=o;
}
}

int main(void)
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);

Init(); Bfs();

return 0;
}

④ 求统计二叉树叶子结点数的递归算法

···cpp

由于不知道你的存储方式,假设你是指针存,用孩子兄弟表示法。

(伪)代码:

structnode{
data{
...
}val;
node*fchild,*brother;
}
voidgetnum(nodex){
if(x.fchild==nu)ans++;
else{
getnum(*x.fchild);
getnum(*x.brother);
}
}

就这样

⑤ 跪求!!10分奉上!统计二叉树结点个数的算法 非递归

一般情况下,涉及二叉树的很多操作都包含两个方面。一方面,由于二叉树本身的递归定义,因此用递归的思想设计其很多操作是顺理成章的;另一方面,为了控制过程的深度和节约栈空间,我们有时也会考虑用非递归的思想设计很多关于二叉树的操作。必须说明的是,非递归思想一般都需要额外栈或队列结构的支持。下面来看一下关于统计二叉树结点个数的非递归算法设计:
1、将根结点插入队列。
2、判断队列是否为空,非空执行第三步,否则执行第四步退出循环。
3、从队列中取出一个结点,同时将取出结点的儿子结点插入队列。此外,将计数器加1,再转到第二步。
4、结束循环。
注意:队列是先进先出的结构,与栈相反。
如果你根据以上仍然不能写出完整的程序,下面的程序可作为你的参考。
int size()//返回结点数函数
{
linkqueue<node*>list;//定义元素为node*型的队列
int sum=0;
list.push(root);
while(!list.empty())
{
node* p=list.top();//保存即将出队的元素
list.pop();//队列首元素出队
if(p->lchild)//左儿子不为空,即进队
list.push(p->lchild);
if(p->rchild)//同上
list.push(p->rchild);
sum++;//计数器增1
}
return sum;
}
要想完全把握以上程序你必须对队列的结构有很好的理解。此外,需要说明的是,计数器是以出队元素个数为指标进行计数的,而非进队元素。这样可使程序简洁和容易理解得多。

⑥ 求C语言统计一棵二叉树节点总数的算法(只要函数)

用递归啊,除了叶子节点以外,每个节点都有左子树和右子树,只要判断子节点不为空就用递归调用函数统一子树的节点数,例如
f(t)=f(l)+f(r)+1;
节点总数等于左子树的节点数+右子树的节点数+1

⑦ 数据结构 递归算法统计二叉树结点个数

int
leafnum(Bnode
*t)
{
int
i,j;
if(
t
==
NULL
)return
0;
else
if(
t->lchild
==
NULL
&&
t->rchild
==
NULL
)
return
1;
else
{
i
=
leafnum(t->lchild);
j
=
leafnum(t->rchild);
return
(i+j);
}
}
??????
这个应该不是你要的,希望对你有所启发。

⑧ 数据结构问题,求解 设计算法,统计二叉树中结点个数。

typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild; //左、右孩子指针
}BiNode,*BiTree;
int NodeCount(BiTree T){
if(T == NULL ) return 0;//如果是空树,则结点个数为0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
//结点个数为左子树的结点个数+右子树的结点个数再+1
}

⑨ 求一棵二叉树的结点总数的算法

int
GetCount(BTree
T)
{
if(T==NULL)
return
0;
return
1+GetCount(T.left)+GetCount(T.right);
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int
TreeDepth(BinTree
T)
{
int
hl,hr,max;
if(T){
hl=TreeDepth(T->lchild);
//求左深度
hr=TreeDepth(T->rchild);
//求右深度
max=hl>hr?
hl:hr;
//取左右深度的最大值
NodeNum=NodeNum+1;
//求结点数
if(hl==0&&hr==0)
leaf=leaf+1;
//若左右深度为0,即为叶子。
return(max+1);
}
else
return(0);
}
}

阅读全文

与统计二叉树分支结点数量算法相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:763
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:840
安卓怎么下载60秒生存 浏览:800
外向式文件夹 浏览:232
dospdf 浏览:428
怎么修改腾讯云服务器ip 浏览:382
pdftoeps 浏览:490
为什么鸿蒙那么像安卓 浏览:732
安卓手机怎么拍自媒体视频 浏览:183
单片机各个中断的初始化 浏览:721
python怎么集合元素 浏览:477
python逐条解读 浏览:829
基于单片机的湿度控制 浏览:496
ios如何使用安卓的帐号 浏览:879
程序员公园采访 浏览:807
程序员实战教程要多长时间 浏览:970
企业数据加密技巧 浏览:132
租云服务器开发 浏览:809
程序员告白妈妈不同意 浏览:332
攻城掠地怎么查看服务器 浏览:597