C語言數(shù)據(jù)結(jié)構(gòu)系列篇二叉樹的概念及滿二叉樹與完全二叉樹
?? 鏈接:C語言數(shù)據(jù)結(jié)構(gòu)系列之樹的概念結(jié)構(gòu)和常見表示方法
0x00 概念
?? 定義:二叉樹既然叫二叉樹,顧名思義即度最大為2的樹稱為二叉樹。 它的度可以為 1 也可以為 0,但是度最大為 2 。
?? 一顆二叉樹是節(jié)點(diǎn)的一個(gè)有限集合,該集合:
① 由一個(gè)根節(jié)點(diǎn)加上兩顆被稱為左子樹和右子樹的二叉樹組成
② 或者為空
?? 觀察上圖我們可以得出如下結(jié)論:
① 二叉樹不存在度大于 2 的節(jié)點(diǎn),換言之二叉樹最多也只能有兩個(gè)孩子。
② 二叉樹的子樹有左右之分,分別為左孩子和右孩子。次序不可顛倒,因此二叉樹是有序樹。
?? 注意:對于任意的二叉樹都是由以下幾種情況復(fù)合而成的:
0x01 滿二叉樹
?? 定義:一個(gè)二叉樹,如果每一層的節(jié)點(diǎn)數(shù)都達(dá)到了最大值(均為2),則這個(gè)二叉樹就可以被稱作為 "滿二叉樹" 。
?? 換言之,如果一個(gè)二叉樹的層數(shù)為,且節(jié)點(diǎn)總數(shù)是
,則他就是一個(gè)滿二叉樹。
?? 計(jì)算公式:
① 已知層數(shù)求總數(shù):
② 已知總數(shù)求層數(shù):
? 十億個(gè)節(jié)點(diǎn),滿二叉樹是多少層?
?? ≈ 10億多
0x02 完全二叉樹
?? 定義:對于深度為 的,有
個(gè)結(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)其每一個(gè)結(jié)點(diǎn)都與深度為
的滿二叉樹中編號從 1 至
的結(jié)點(diǎn)一一對應(yīng)時(shí)稱之為完全二叉樹。
?? 前 層是滿的,最后一層不滿,但是最后一層從左到右是連續(xù)的。
完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹是由滿二叉樹而引出來的。所以,滿二叉樹是一種特殊的完全二叉樹(每一層節(jié)點(diǎn)均為2)。
?? 常識:
① 完全二叉樹中,度為 1 的最多只有 1 個(gè)。
② 高度為 的完全二叉樹節(jié)點(diǎn)范圍是
0x03 二叉樹的性質(zhì)
?? 四點(diǎn)規(guī)則:
① 若規(guī)定根節(jié)點(diǎn)的層數(shù)為 1 ,則一顆非空二叉樹的第 層上最多有
個(gè)節(jié)點(diǎn)。
② 若規(guī)定根節(jié)點(diǎn)的層數(shù)為 1 ,則深度為 的二叉樹最大節(jié)點(diǎn)數(shù)是
.
③ 對任何一顆二叉樹,如果度為 0 其葉子結(jié)點(diǎn)個(gè)數(shù)為 ,度為 2 的分支節(jié)點(diǎn)個(gè)數(shù)為
,則有
。換言之,度為 0 的永遠(yuǎn)比度為 2 的多一個(gè)葉子結(jié)點(diǎn)。
④ 若規(guī)定根節(jié)點(diǎn)的層數(shù)為 1 , 具有 個(gè)節(jié)點(diǎn)的滿二叉樹的深度
(log是以2為底,n+1的對數(shù))。
?? 對于有 個(gè)節(jié)點(diǎn)的完全二叉樹,如果按照從上至下從左至右的數(shù)組順序?qū)λ泄?jié)點(diǎn)從 0 開始編號,則對于序號為
的節(jié)點(diǎn)有:
(非完全二叉樹,也可以用數(shù)組存放,但會浪費(fèi)很多空間)
假設(shè) 是父節(jié)點(diǎn)在數(shù)組中的下標(biāo),此公式僅適用于完全二叉樹:
① 求左孩子:
② 求右孩子:
③ 求父親(假設(shè)不關(guān)注是左孩子還是右孩子):
④ 判斷是否有左孩子:
⑤ 判斷是否由右孩子:
?? PS:二叉樹不一定要標(biāo)準(zhǔn),比如這個(gè)其實(shí)也是二叉樹:
課后練習(xí):
1. 某二叉樹共有 399 個(gè)結(jié)點(diǎn),其中有 199 個(gè)度為 2 的結(jié)點(diǎn),則該二叉樹中的葉子結(jié)點(diǎn)數(shù)為( )
A. 不存在這樣的二叉樹
B. 200
C. 198
D. 199
2. 在具有 2n 個(gè)結(jié)點(diǎn)的完全二叉樹中,葉子結(jié)點(diǎn)個(gè)數(shù)為( )
A. n
B. n+1
C. n-1
D. n/2
3. 一棵完全二叉樹的節(jié)點(diǎn)數(shù)位為531個(gè),那么這棵樹的高度為( )
A. 11
B. 10
C. 8
D. 12
5. 一個(gè)具有767個(gè)節(jié)點(diǎn)的完全二叉樹,其葉子節(jié)點(diǎn)個(gè)數(shù)為()
A. 383
B. 384
C. 385
D. 386
參考資料:
Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
百度百科[EB/OL]. []. https://baike.baidu.com/.
?? 筆者:王亦優(yōu)
?? 更新: 2021.11.24
? 勘誤: 無
?? 聲明: 由于作者水平有限,本文有錯誤和不準(zhǔn)確之處在所難免,本人也很想知道這些錯誤,懇望讀者批評指正!
本篇完。
到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)系列篇二叉樹的概念及滿二叉樹與完全二叉樹的文章就介紹到這了,更多相關(guān)C語言 二叉樹的概念內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Cartographer源碼中關(guān)于Sensor的數(shù)據(jù)走向深扒
這篇文章主要介紹了C++ Cartographer源碼中關(guān)于Sensor的數(shù)據(jù)走向,整個(gè)Cartographer源碼閱讀是很枯燥的, 但絕對是可以學(xué)到東西的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07