① 设计一个算法,统计一棵二叉树中所有叶节点的数目及非叶结点的数目
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);
}
}