二叉樹的簡單介紹以及二叉樹的儲存結構

2022-02-24 07:44:06 字數 3510 閱讀 3544

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。

二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^個結點(頂層為第一層);深度為k的二叉樹至多有2^k-1個結點,一棵深度為k,且有2^k-1個節點稱之為滿二叉樹;深度為k,有n個節點的二叉樹,當且僅當其每乙個節點都與深度為k的滿二叉樹中,序號為1至n的節點對應時,稱之為完全二叉樹。二叉樹常被用於實現二叉查詢樹和二叉堆。

(1)空二叉樹——如圖(a);

(2)只有乙個根結點的二叉樹——如圖(b);

(3)只有左子樹——如圖(c);

(4)只有右子樹——如圖(d);

(5)完全二叉樹——如圖(e)。

樹的結點:包含乙個資料元素及若干指向子樹的分支;

孩子結點:結點的子樹的根稱為該結點的孩子;

雙親結點:b 結點是a 結點的孩子,則a結點是b 結點的雙親;

兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;

祖先結點: 從根到該結點的所經分支上的所有結點子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫

結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;

樹的深度:樹中最大的結點層

結點的度:結點子樹的個數

樹的度: 樹中最大的結點度。

葉子結點:也叫終端結點,是度為 0 的結點;

分枝結點:度不為0的結點;

有序樹:子樹有序的樹,如:家族樹;

無序樹:不考慮子樹的順序;

1.一顆非空二叉樹的第i層上最多有2i-1個結點(i>=1)。

2.一顆深度為k的二叉樹中,最多具有2k-1個結點。

3.對於一顆非空二叉樹,如果葉子結點樹為n0,度數為2的二叉樹結點為n2,則有n0=n2+1;

4.具有n個結點的完全二叉樹的深度k為[log2n]+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二叉樹的順序儲存

1

#define maxsize 100 //

假設一維陣列最多存放100個元素

2 typedef char datatype; //

假設二叉樹元素的資料型別為字元

3 typedef struct

4btseq;

二叉樹的鏈式儲存結構是指,用鍊錶來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。

其中,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,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹 48 二叉樹 二叉樹的高度

目的 使用c 模板設計並逐步完善二叉樹的抽象資料型別 adt 內容 1 請參照鍊錶的adt模板,設計二叉樹並逐步完善的抽象資料型別。由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在乙個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材 課件,以及網盤中的鍊錶...