① 設計一個演算法,統計一棵二叉樹中所有葉節點的數目及非葉結點的數目
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);
}
}