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

求二叉樹的高度演算法

發布時間: 2023-06-01 05:34:52

A. 怎麼計算二叉樹高度

分析二叉樹的深度(高度)和它的左、右子樹深度之間的關系。從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加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;

}

(1)求二叉樹的高度演算法擴展閱讀:

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

二叉樹的深度是從根節點開始(其深度為1)自頂向下逐層累加的;而二叉樹高度是從葉節點開始(其高度為1)自底向上逐層累加的。雖然樹的深度和高度一樣,但是具體到樹的某個節點,其深度和高度是不一樣的。

B. 求二叉樹高度的原理、演算法是什麼,越詳細越好,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;
}

C. 什麼是二叉樹如何計算二叉樹的高度

看左子樹高還是右子樹高,高的那個的高度加一就是整個二叉樹的高度了。利用這個關系,搞個遞歸就出來了。

D. 以二叉鏈表作存儲結構,試編寫求二叉樹高度的演算法

主方法調用RootFirst(&root,0);即可,g_nMax 即為最終的樹啟正的高度。
int g_nMax = 0;
voild RootFirst(TreeNode *p,int nLevel)
{
if (null == p->left && null == p->right) //當前為葉子節點
{
if (g_nMax < nLevel)
{
g_nMax = nLevel;
return;
}
}
if(null != p->left )
{
RootFirst(p->left,nLevel+1);//遍歷左虧岩子樹
}
if(null != p->right)
{
RootFirst(p->right,nLevel+1);//遍歷右悄空悔子樹
}
}

E. 求二叉樹的高度

公式:V0=(V2)
+2(
V3)+3
(V4)....(k-1)(Vk)+1
所有的樹都滿足這個公式,其中v0...vk代表
度為0...K的節點個數。
所有計算度與節點個數的問題無論是幾叉樹的都必須用這個式子,我建議樓主哥哥記住!
葉子節點就是度為0的節點V0,其他的分支節點度都為m那麼就只存在度為0和度為m的節點
代入上面公式:
V0=(m-1)Vm+1
又因為:
Vm+V0=n
//因為樹總共n個節點
解這個方程組,就得
V0=((m-1)n+1)/m
用計算機計算
,你可以將它理解成一個層序遍歷的過程,使用隊列來遍歷:
存儲結構是
typedef
struct
Node
{
int
data;
struct
node
*FirstChild;
struct
node
*NextBrother;
}*Tree;
static
int
leafnum;
//全局函數用於計數葉子節點
void
BFSCount(Tree
t)
{
int
i=0;
SeqQueue
*Q;
TreeNode
*p;
InitQueue(Q);
if(t==NULL)
return;
EnterQueue(Q,t);
While(!Empty(Q))
{
DeleteQueue(Q,p);
//出隊
然後判斷這個節點
if(p->FirstChild==NULL)
leafnum++;
//如果這個節點一個孩子也沒有,則是葉子,計數+1
else{
p=t->FirstChild;
//否則開始將它第一個孩子繼續進入隊
EnterQueue(Q,p);
while(i<=m)
//把第一個孩子的下一個兄弟依次入隊
{
p=p->NextBrother;
EnterQueue(Q,p);
}
}
}
}

F. 求一個二叉樹的高度 用遞歸的方法

如果是結點的定義中有深度這個屬性,那麼用一個隊列就可以了。
隊首放節點
隊尾取出節點
比如:根節點放入隊列
(開始只有這個一個節點在隊列中)
然後呢
從隊尾取出這個根節點
然後打散
把他的左右孩子放虛粗則入對首(這時候有2個節點
也就是二叉樹的第二層)
之後凳脊從隊伍里取出這2個差棚節點
打散
之後隊伍里應該是
二叉樹第三層的4個節點
。。。。。
這樣就把二叉樹層次遍歷了
因為有些節點沒有孩子節點
也就是葉子
這個隊列中的節點
逐漸會越來越少
最後一個取出隊列的節點
的深度也就是二叉樹的高度
如果結點定義沒有深度,我寫了一個方法,請樓主參考。
public
static
int
findlevel(binarynode
root)
{
arraylist
>
result=new
arraylist
>();
linkedlist
list=new
linkedlist
();
list.add(root);
result.add(list);
int
level=0;
while(true)
{
list=new
linkedlist
();
for(int
i=0;i
0)
result.add(list);
else
break;
level++;
}
return
level;
}
其實思路和剛才說的是大同小異的,用一個level來記錄二叉樹的層次,最底的層次就是他的高度。
每一層都存在單獨的list里,這些list再存在一個arraylist里,這樣很容易就能知道每一層有哪些結點,如果這些結點有孩子,就把level++,直到某一層沒有任何結點有孩子,這時候level就是最後一層了。

G. 二叉樹的高度是多少

二叉樹的高度:對於任意節點n,n的高度為從n到一片樹葉的最長路徑長,所有樹葉的高度為0。

二叉樹的高度是垂直方向上樹的長度的量度。 葉節點的高度為0,因為它們下磨橋正面沒有節點。 二叉樹的根節點的高度是整個樹的高度。 特定節點的高度是從該節點到葉節點的最長路徑上的邊數。

特點:

很多時候,人們對二叉樹的深度和高度感到困惑。 這瞎悔是因為二叉樹的深度始終等於二叉樹的高度,但是它們不相同,並且互換使用這些術語是不正確的。 因此,重要的是要了解二叉樹的高度和深度之間的差異。

二叉樹的高度是垂直方向上樹的長度的量度,它是從孩子到父母的向上方向測量的,葉節點的高度為0,因為它們下面沒有節點。二叉樹的根節點的高度是消裂整個樹的高度。 特定節點的高度是從該節點到葉節點的最長路徑上的邊數。

H. 已知完全二叉樹的節點數怎麼求高度

就是求log以2為底的結點數的對數下取整+1,比如一顆完全二兄卜叉樹的結點數為2000,則log以2為底2000的對數的下取整等答塵遲於10,然清李後+1,就等於11,望採納

I. 求一個二叉樹的高度 用遞歸的方法

先一層一層的遍歷二叉樹 用一裂跡個輔助的數據結構隊列
隊列! 注意 這個很重要
隊首放節點 隊尾取出節點
比如:根節點放入隊列 (開始只有這個一個節點在隊列中)
然後呢 從隊尾取出這個根節點肆核並 然後打散 把他的左右孩子放入對首(這時候有2個節點 也就是二叉樹的第二層)
之後從隊伍里取出這2個節點 打散 之後隊伍里應氏搭該是 二叉樹第三層的4個節點
。。。。。
這樣就把二叉樹層次遍歷了
因為有些節點沒有孩子節點 也就是葉子
這個隊列中的節點 逐漸會越來越少
最後一個取出隊列的節點 的深度也就是二叉樹的高度

所以求二叉樹的高度 就用這種層進性遍歷 每次把節點放入隊列中時 也把他的深度 和節點的指針一起放入 取出一個節點 打散的時候 注意他的子節點的度是他父節點的+1 就ok

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:637
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:366
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:82
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:308
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:789
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:339
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:210
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:810
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:364
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:590