二叉樹的存儲方式
存儲一棵二叉樹有兩種方法,一種是基於指針或者引用的二叉鏈式存儲法,一種是基於數組的順序存儲法。
鏈式存儲法
用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。二叉鏈
每個節點有三個字段,其中一個存儲數據,另外兩個是指向左右子節點的指針。
順序儲存法
順序結構存儲就是使用數組來存儲。
我們把根節點存儲在下標 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的位置。
順序存儲法的優勢就是並不像鏈式存儲法那樣,要存儲額外的左右子節點的指針。
所以,某棵二叉樹是一棵完全二叉樹,那用數組存儲無疑是最節省內存的一種方式。
這也是爲什麼完全二叉樹會單獨拎出來的原因,也是爲什麼完全二叉樹要求最後一層的子節點都靠左的原因。
堆其實就是很好的體現,堆其實就是一種完全二叉樹,最常用的存儲方式就是數組。