二叉樹的存儲結構

二叉樹的存儲結構

二叉樹可以使用順序結構和鏈表結構兩種存儲結構node

順序結構

順序結構實現二叉樹時,採用一個一維數組來存儲全部結點,須要將全部結點按照在樹中的位置安排成一個恰當的序列,使其能反應結點之間相互的邏輯關係,一般使用編號的方法;數組

具體方法:

將二叉樹中全部結點按照徹底二叉樹進行編號,而後使用一維數組存儲,同時使結點編號與數組下標相同,如編號爲1的節點存儲在數組下標爲1的位置;該方法稱爲以編號爲地址的策略數據結構

案例1(徹底二叉樹):
image-20200521020201337

若二叉樹爲徹底二叉樹則上述方法,能夠很好的利用存儲空間,基本沒有浪費,且對於結點的查找是很方便的;spa

案例2(通常二叉樹):
image-20200521020350552

當二叉樹爲通常二叉樹時,如想要使用順序結構存儲則必須增長虛擬結點,使其變爲徹底二叉樹,像下面這樣:3d

image-20200521020453983

這樣一來則須要浪費一部分存儲空間,極端狀況下,若二叉樹是一分叉的(每一個節點只有一個子節點),將形成極大的空間浪費指針

image-20200521020818408

鏈式存儲結構

鏈式存儲結構,分爲兩種二叉鏈表和三叉鏈表code

二叉鏈表

每一個結點由一個數據域和兩個指針域組成,共三個部分,以下圖所示blog

image-20200521011205379
數據結構定義:
typedef struct btnode {
	DataType data;
	struct btnode *lchild,*rchild;
}*BinTree;
案例:
image-20200521012125172

因爲使用了鏈式存儲結構,在插入或刪除結點時效率比順序結構更好;而且不會形成較大的空間浪費;class

特性:
  • n個結點組成的二叉樹共有2n個指針域,其中有n-1個指向左右子結點的非空指針域,(兩個節點關聯須要一個指針域,以此類推3個結點關聯須要2個指針域)和n+1個空指針域
  • 已知某結點地址求其子結點方便,求其父節點則須要從頭開始遍歷

三叉鏈表

因爲二叉鏈表查找父結點須要遍歷全部結點,效率較低,若對於常常須要查詢父結點的二叉樹,則可使用三叉鏈表來提升效率,三叉鏈表在二叉鏈表的基礎上增長了一個parent指針域,以下圖所示:效率

image-20200521014338764
案例:
image-20200521015716404 能夠看出三叉鏈表與二叉鏈表沒有太大區別,犧牲一些空間換來了查詢父結點的效率;
相關文章
相關標籤/搜索