當前位置:首頁 » 操作系統 » 樹度的演算法

樹度的演算法

發布時間: 2022-05-03 18:51:28

Ⅰ C語言關於二叉樹的度的演算法

可憐的管理員哭泣著亂踹兩腳
被映得粉亮的翅膀,直到拖著尖銳的
我們為之乾杯的死亡,
父親戴一件絨毛狀火紅頭飾
讓路。白日懷疑自己,
她每天只就讓復一個工作哈哈

Ⅱ 二叉樹的深度怎麼算

二叉樹的深度計算,首先要判斷節點,以下是計算二叉樹的詳細步驟:

1、一顆樹只有一個節點,它的深度是1;

2、二叉樹的根節點只有左子樹而沒有右子樹,那麼可以判斷,二叉樹的深度應該是其左子樹的深度加1;

3、二叉樹的根節點只有右子樹而沒有左子樹,那麼可以判斷,那麼二叉樹的深度應該是其右樹的深度加1;

4、二叉樹的根節點既有右子樹又有左子樹,那麼可以判斷,那麼二叉樹的深度應該是其左右子樹的深度較大值加1。

一棵深度為k,且有2^k-1個節點的二叉樹,稱為滿二叉樹。這種樹的特點是每一層上的節點數都是最大節點數。而在一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且最後一層或者是滿的,或者是在右邊缺少連續若干節點,則此二叉樹為完全二叉樹。

具有n個節點的完全二叉樹的深度為floor(log2n)+1。深度為k的完全二叉樹,至少有2k-1個葉子節點,至多有2k-1個節點。


5、有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系:

若I為結點編號則 如果I>1,則其父結點的編號為I/2;

如果2*I<=N,則其左孩子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左孩子;

Ⅲ 二叉樹深度的演算法

#include"stdio.h"
#include"alloc.h"
typedef
char
datatype;
typedef
struct
node
{
datatype
data;
struct
node
*lchild,
*rchild;
}
bitree;
int
k
=
1;
bitree
*Q[10];
bitree
*CREAT()
{
char
ch;
int
front,
rear;
bitree
*root,
*s;
root
=
NULL;
front
=
1;
rear
=
0;
printf("\n
=======
二叉樹
的建立和遍歷=======\n");
printf("
請輸入字元:
");
ch
=
getchar();
while
(ch
!=
'$')
{
s
=
NULL;
if
(ch
!=
'@')
{
s
=
malloc(sizeof(bitree));
s
->
data
=
ch;
s
->
lchild
=
NULL;
s
->
rchild
=
NULL;
}
rear++;
k
=
k++;
Q[rear]
=
s;
if
(rear
==
1)
root
=
s;
else
{
if
(s
&&
Q[front])
if
(rear
%
2
==
0)
Q[front]
->
lchild
=
s;
else
Q[front]
->
rchild
=
s;
if
(rear
%
2
==
1)
front++;
}
ch
=
getchar();
}
return
root;
}
int
COUNTER(t)
bitree
*t;
{
if
(t
==
NULL)
return
0;
else
if
(t->lchild
!=
NULL
&&
t->rchild
==
NULL
||
t->lchild
==
NULL
&&
t->rchild
!=
NULL)
return
1;
else
return
COUNTER(t->lchild)
+
COUNTER(t->rchild);
}
main()
{
int
i;
bitree
*p;
p
=
CREAT();
printf("
建立的二叉樹為:
");
for
(i
=
0;
i
<
k;
i++)
{
printf("%c
",
Q[i]
->
data);
}
printf("\n
度為1的節點數為:
");
printf("%d
",
COUNTER(p));
}
這是二叉樹的建立
遍歷
加二叉樹的度為1的結點的演算法

Ⅳ 關於求二叉樹深度的遞歸演算法

關於遞歸,你可以看成是一句一句往下運行嘛。需要保存狀態的時候,系統就會自動用棧幫你保存。就依你說得那個為例:
n為全局變數,初值為0;

第一次調用height(T),假設T!=NULL
由於T!=NULL:跳過if (T==NULL) return 0;

關鍵到了u=height(T->lchild); 調用本身的函數:此時的T->lchild保存在棧中,既然是調用就得從函數開頭執行:
看下這時候T2(其實就是T->lchild),if (T==NULL) return 0;
這里假設T不是NULL,就繼續運行在遇到u=height(T->lchild); 在調這個函數本身——
這里就假設它為T->lchild==NULL吧。這下可好,這個函數執行return 0;

慢著:第二次函數調用u=height(T->lchild)中的函數值已經計算出來啦。這時u=0;

你還記得第二次調用運行到了v=height(T->rchild); 這句話吧?好,這個過程就和u=height(T->lchild)完全一樣。
這里也假設得到的v=0

則第二次調用到了if (u>n) return (u+1)
return (v+1)
得到一個返回值,不如就假設u〉n,於是返回值1;
好,這一波完畢;

你還記得第一次調用的height吧,這時把返回值給u,u=1;
然後執行到第一次調用中的v=height(T->rchild); 了。分析同上。

這個過程的確比較復雜。慢慢琢磨吧。呵呵。

Ⅳ 二叉樹的深度演算法怎麼算啊

二叉樹的深度演算法:
一、遞歸實現基本思想:
為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞歸返回的條件是若節點為空,返回0
演算法:
1
int
FindTreeDeep(BinTree
BT){
2
int
deep=0;
3
if(BT){
4
int
lchilddeep=FindTreeDeep(BT->lchild);
5
int
rchilddeep=FindTreeDeep(BT->rchild);
6
deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
7
}
8
return
deep;
9
}
二、非遞歸實現基本思想:
受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求二叉樹的深度,在每一次輸出的地方替換成算棧S的大小,遍歷結束後最大的棧S長度即是棧的深度。
演算法的執行步驟如下:
(1)當樹非空時,將指針p指向根節點,p為當前節點指針。
(2)將p壓入棧S中,0壓入棧tag中,並令p執行其左孩子。
(3)重復步驟(2),直到p為空。
(4)如果tag棧中的棧頂元素為1,跳至步驟(6)。從右子樹返回
(5)如果tag棧中的棧頂元素為0,跳至步驟(7)。從左子樹返回
(6)比較treedeep與棧的深度,取較大的賦給treedeep,對棧S和棧tag出棧操作,p指向NULL,並跳至步驟(8)。
(7)將p指向棧S棧頂元素的右孩子,彈出棧tag,並把1壓入棧tag。(另外一種方法,直接修改棧tag棧頂的值為1也可以)
(8)循環(2)~(7),直到棧為空並且p為空
(9)返回treedeep,結束遍歷
1
int
TreeDeep(BinTree
BT
){
2
int
treedeep=0;
3
stack
S;
4
stack
tag;
5
BinTree
p=BT;
6
while(p!=NULL||!isEmpty(S)){
7
while(p!=NULL){
8
push(S,p);
9
push(tag,0);
10
p=p->lchild;
11
}
12
if(Top(tag)==1){
13
deeptree=deeptree>S.length?deeptree:S.length;
14
pop(S);
15
pop(tag);
16
p=NULL;
17
}else{
18
p=Top(S);
19
p=p->rchild;
20
pop(tag);
21
push(tag,1);
22
}
23
}
24
return
deeptree;
25
}

Ⅵ 求二叉樹高度的原理、演算法是什麼,越詳細越好,C語言,謝謝

首先分析二叉樹的深度(高度)和它的左、右子樹深度之間的關系。從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加1。由此,需先分別求得左、右子樹的深度,演算法中「訪問結點」的操作為:求得左、右子樹深度的最大值,然後加
1

int
Depth
(BiTree
T
){
//
返回二叉樹的深度
if
(
!T
)
depthval
=
0;
else
{
depthLeft
=
Depth(
T->lchild
);
depthRight=
Depth(
T->rchild
);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft
:
depthRight);
}
return
depthval;
}

Ⅶ 關於遞歸演算法求二叉樹深度演算法

u,v 分別求出當前節點左子樹和右子樹的深度(高度),
然後當前節點的 深度就等於左右子樹裡面較大的那個+1.

if (u>n) return (u+1)
return (v+1)
這句就是返回較深的+1.

u=height(T->lchild);
v=height(T->rchild);

這兩句就是遞歸的調用,求深度了。

if (T==NULL) return 0;

這個就是終止條件了,如果沒有子節點就返回。

Ⅷ 求一個關於求二叉樹度為2的結點數 的演算法

分析:二叉樹中2度結點數的遞歸定義為
①當T為空或為葉子時,以T為根的二叉樹的2度結點數為0;
②當T是2度結點時,以T為根的二叉樹的2度結點數為T的左右子樹中2度結點數這和再加上T結點本身;
③當T是1度結點時,以T為根的二叉樹中2度結點數為T的左或子樹中2度結點數之和.
其演算法如下:
int D2Nodes(BinTree T){
if(!T||!T->lchild&&!T->rchild) //T為空或是葉子
return 0;
if(T->lchild&&T->rchild) //T是2度結點
return 1+D2Nodes(T->lchild)+D2Nodes(T->rchild);
else //T是1度結點
return D2Nodes(T->lchild)+D2Nodes(T->rchild);
}

Ⅸ 對以孩子鏈表表示的樹編寫計算樹的深度的演算法

typedef struct TreeNode
{
TreeNode *child;
TreeNode *sibling;
int data;
}TreeNode;
//這是用了遞歸的思想,需要仔細體會
int GetChildeSiblingTreeDegree(TreeNode *root)
{
//如果當前樹的根節點沒有孩子和兄弟,那麼,該樹的度就是0
if (root->child == NULL && root->sibling == NULL)
{
return 0;
}
//如果該樹只有兄弟,則該樹的度就等效於對他的兄弟分支的子樹求度
else if( root->sibling != NULL)
{
return GetChildeSiblingTreeDegree(root->sibling);
}
//如果該樹只有孩子,那麼先求出該根節點的度,然後再對它孩子分支子樹求度,兩者取較大者,即該樹的度
else if(root->child != NULL)
{
int rootDegree = 1;
TreeNode *p = root->child;

while(p->sibling != NULL)
{
p = p->sibling;
rootDegree++;
}

int childTreeDegree = GetChildeSiblingTreeDegree(root->child);

return rootDegree > childTreeDegree ? rootDegree : childTreeDegree;
}
}

Ⅹ 葉子節點數計算公式是什麼

結點的度是指,該結點的子樹的個數,在二叉樹中,不存在度大於2的結點。

計算公式:n0=n2+1

n0 是葉子節點的個數

n2 是度為2的結點的個數

n0=n2+1=5+1=6

故二叉樹有5個度為2的結點,則該二叉樹中的葉子結點數為6。

(10)樹度的演算法擴展閱讀:

葉子結點就是度為0的結點,就是沒有子結點的結點。

n0:度為0的結點數,n1:度為1的結點 n2:度為2的結點數,N是總結點。

在二叉樹中:

n0=n2+1;

N=n0+n1+n2

熱點內容
我的世界rpg伺服器背包位置 發布:2024-10-06 16:19:03 瀏覽:56
python的運行速度 發布:2024-10-06 16:19:02 瀏覽:803
怎麼看qq綁定了微信賬號密碼是什麼 發布:2024-10-06 16:04:41 瀏覽:772
安卓電視裝軟體對電視有什麼影響 發布:2024-10-06 16:01:54 瀏覽:440
編程廣播積木 發布:2024-10-06 16:01:42 瀏覽:88
聽音樂有緩存文件嗎 發布:2024-10-06 15:56:10 瀏覽:84
等級演算法 發布:2024-10-06 15:45:26 瀏覽:874
伺服器放上海還是北京雲主機 發布:2024-10-06 15:43:12 瀏覽:415
日常編程 發布:2024-10-06 15:43:02 瀏覽:327
生產任務量如何配置 發布:2024-10-06 15:40:39 瀏覽:196