二叉樹的存儲方式 以及 爲什麼會有完全二叉樹這一概念和定義???

二叉樹的存儲方式

存儲一棵二叉樹有兩種方法,一種是基於指針或者引用的二叉鏈式存儲法,一種是基於數組的順序存儲法。

 

鏈式存儲法

用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。二叉鏈

每個節點有三個字段,其中一個存儲數據,另外兩個是指向左右子節點的指針。

 

順序儲存法

順序結構存儲就是使用數組來存儲。

我們把根節點存儲在下標 i = 1 的位置,那左子節點存儲在下標 2 * i = 2 的位置,右子節點存儲在 2 * i + 1 = 3 的位置。

以此類推,B 節點的左子節點存儲在 2 * i = 2 * 2 = 4 的位置,右子節點存儲在 2 * i + 1 = 2 * 2 + 1 = 5 的位置。

 如果節點 X 存儲在數組中下標爲 i 的位置,下標爲 2 * i 的位置存儲的就是左子節點。

下標爲 2 * i + 1 的位置存儲的就是右子節點。

反過來,下標爲 i/2 的位置存儲就是它的父節點。

通過這種方式,我們只要知道根節點存儲的位置,就可以通過下標計算,把整棵樹都串起來。

(一般情況下,爲了方便計算子節點,根節點會存儲在下標爲 1 的位置)

 

爲什麼會有完全二叉樹這一概念,而且要求完全二叉樹最後一層的節點要全部靠左排列呢?

 

關於剛纔的順序存儲法,列舉的是一個完全二叉樹的例子。若是非完全二叉樹呢?

可以看出來,非完全二叉樹會浪費很多的存儲空間。

而完全二叉樹僅僅只”浪費“了下標爲0的位置。

 

順序存儲法的優勢就是並不像鏈式存儲法那樣,要存儲額外的左右子節點的指針。

所以,某棵二叉樹是一棵完全二叉樹,那用數組存儲無疑是最節省內存的一種方式。

 

這也是爲什麼完全二叉樹會單獨拎出來的原因,也是爲什麼完全二叉樹要求最後一層的子節點都靠左的原因。

 

堆其實就是很好的體現,堆其實就是一種完全二叉樹,最常用的存儲方式就是數組。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章