二叉樹的儲存結構
二叉樹可使用順序結構和連結串列結構兩種儲存結構
順序結構
順序結構實現二叉樹時,採用一個一維陣列來儲存所有結點,需要將所有結點按照在樹中的位置安排成一個恰當的序列,使其能反應結點之間相互的邏輯關係,通常使用編號的方法;
具體方法:
將二叉樹中所有結點按照完全二叉樹進行編號,然後使用一維陣列儲存,同時使結點編號與陣列下標相同,如編號為1的節點儲存在陣列下標為1的位置;該方法稱為以編號為地址的策略
案例1(完全二叉樹):
若二叉樹為完全二叉樹則上述方法,可以很好的利用儲存空間,基本沒有浪費,且對於結點的查詢是很方便的;
案例2(一般二叉樹):
當二叉樹為一般二叉樹時,如想要使用順序結構儲存則必須增加虛擬結點,使其變為完全二叉樹,像下面這樣:
這樣一來則需要浪費一部分儲存空間,極端情況下,若二叉樹是一分叉的(每個節點只有一個子節點),將造成極大的空間浪費
鏈式儲存結構
鏈式儲存結構,分為兩種二叉連結串列和三叉連結串列
二叉連結串列
每個結點由一個資料域和兩個指標域組成,共三個部分,如下圖所示
資料結構定義:
typedef struct btnode {
DataType data;
struct btnode *lchild,*rchild;
}*BinTree;
案例:
由於使用了鏈式儲存結構,在插入或刪除結點時效率比順序結構更好;並且不會造成較大的空間浪費;
特性:
- n個結點組成的二叉樹共有2n個指標域,其中有n-1個指向左右子結點的非空指標域,(兩個節點關聯需要一個指標域,以此類推3個結點關聯需要2個指標域)和n+1個空指標域
- 已知某結點地址求其子結點方便,求其父節點則需要從頭開始遍歷
三叉連結串列
由於二叉連結串列查詢父結點需要遍歷所有結點,效率較低,若對於經常需要查詢父結點的二叉樹,則可以使用三叉連結串列來提高效率,三叉連結串列在二叉連結串列的基礎上增加了一個parent指標域,如下圖所示: