二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。
1.順序儲存結構
二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的方法從樹根起,自上層至下層,每層自左至右地給所有結點編號,缺點是有可能對儲存空間造成極大的浪費,在最壞的情況下,乙個深度為k且只有k個結點的右單支樹需要2k-1個結點儲存空間。依據二叉樹的性質,完全二叉樹和滿二叉樹採用順序儲存比較合適,樹中結點的序號可以唯一地反映出結點之間的邏輯關係,這樣既能夠最大可能地節省儲存空間,又可以利用陣列元素的下標值確定結點在二叉樹中的位置,以及結點之間的關係。圖5-5(a)是一棵完全二叉樹,圖5-5(b)給出的圖5-5(a)所示的完全二叉樹的順序儲存結構。
(a) 一棵完全二叉樹 (b) 順序儲存結構
圖5-5 完全二叉樹的順序儲存示意圖
對於一般的二叉樹,如果仍按從上至下和從左到右的順序將樹中的結點順序儲存在一維陣列中,則陣列元素下標之間的關係不能夠反映二叉樹中結點之間的邏輯關係,只有增添一些並不存在的空結點,使之成為一棵完全二叉樹的形式,然後再用一維陣列順序儲存。如圖5-6給出了一棵一般二叉樹改造後的完全二叉樹形態和其順序儲存狀態示意圖。顯然,這種儲存對於需增加許多空結點才能將一棵二叉樹改造成為一棵完全二叉樹的儲存時,會造成空間的大量浪費,不宜用順序儲存結構。最壞的情況是右單支樹,如圖5-7 所示,一棵深度為k的右單支樹,只有k個結點,卻需分配2k-1個儲存單元。
(a) 一棵二叉樹 (b) 改造後的完全二叉樹
(c) 改造後完全二叉樹順序儲存狀態
圖5-6 一般二叉樹及其順序儲存示意圖
(a) 一棵右單支二叉樹 (b) 改造後的右單支樹對應的完全二叉樹
(c) 單支樹改造後完全二叉樹的順序儲存狀態
圖5-7 右單支二叉樹及其順序儲存示意圖
結構5-1二叉樹的順序儲存
#define maxsize 100 //2.鏈式儲存結構二叉樹的鏈式儲存結構是指,用鍊錶來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。假設一維陣列最多存放100個元素
typedef char datatype; //
假設二叉樹元素的資料型別為字元
typedef struct
btseq;
通常的方法是鍊錶中每個結點由三個域組成,資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存位址。其結點結構為:
其中,data域存放某結點的資料資訊;lchild與rchild分別存放指向左孩子和右孩子的指標,當左孩子或右孩子不存在時,相應指標域值為空(用符號∧或null表示)。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為二叉鍊錶,如圖5-8所示。
(a) 一棵二叉樹 (b) 二叉鍊錶儲存結構
圖5-8 二叉樹的二叉鍊錶表示示意圖
為了方便訪問某結點的雙親,還可以給鍊錶結點增加乙個雙親欄位parent,用來指向其雙親結點。每個結點由四個域組成,其結點結構為:
這種儲存結構既便於查詢孩子結點,又便於查詢雙親結點;但是,相對於二叉鍊錶儲存結構而言,它增加了空間開銷。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為三叉鍊錶。
圖5-9給出了圖5-8 (a)所示的一棵二叉樹的三叉鍊錶表示。
圖5-9二叉樹的三叉鍊錶表示示意圖
儘管在二叉鍊錶中無法由結點直接找到其雙親,但由於二叉鍊錶結構靈活,操作方便,對於一般情況的二叉樹,甚至比順序儲存結構還節省空間。因此,二叉鍊錶是最常用的二叉樹儲存方式。
結構5-2二叉樹的鏈式儲存
#define datatype char //定義二叉樹元素的資料型別為字元
typedef struct node //
定義結點由資料域,左右指標組成
bitree;
二叉樹的儲存結構
二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。1 順序儲存結構 二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的...
二叉樹的儲存結構
二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。1 順序儲存結構 二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的...
二叉樹的儲存結構
二叉樹的儲存結構 二叉樹有兩種儲存結構,順序儲存結構和鏈式儲存結構。1.順序儲存結構 就是用一組位址連續的儲存單元依次自上而下,自左向右儲存二叉樹上的節點元素。即將二叉樹上 編號為i的節點元素儲存在某個陣列下標為i 1的分量上。然後通過一些方法確定節點在邏輯上的父子 和兄弟的關係。對於一般的二叉樹,...