資料結構二叉樹

時間 2021-10-14 21:18:05

1樓:

先介紹一下樹:

1.樹的定義

樹是一種常見的非線性的資料結構。樹的遞迴定義如下:

樹是n(n>0)個結點的有限集,這個集合滿足以下條件:

⑴有且僅有一個結點沒有前件(父親結點),該結點稱為樹的根;

⑵除根外,其餘的每個結點都有且僅有一個前件;

⑶除根外,每一個結點都通過唯一的路徑連到根上。這條路徑由根開始,而未端就在該結點上,且除根以外,路徑上的每一個結點都是前一個結點的後件(兒子結點);

2、結點的分類

在樹中,一個結點包含一個元素以及所有指向其子樹的分支。結點一般分成三類

⑴根結點:沒有前件的結點。在樹中有且僅有一個根結點。

⑵分支結點:除根結點外,有後件的結點稱為分支結點。分支結點亦是其子樹的根;

⑶葉結點:沒有後件的結點稱為樹葉。由樹的定義可知,樹葉本身也是其父結點的子樹。

根結點到每一個分支結點或葉結點的路徑是唯一的。

3、有關度的定義

⑴結點的度:一個結點的子樹數目稱為該結點的度。顯

然,所有樹葉的度為0。

⑵樹的度:所有結點中最大的度稱為該樹的度。4、樹的深度(高度)

樹是分層次的。結點所在的層次是從根算起的。根結點在第一層,根的後件在第二層,其餘各層依次類推。

即若某個結點在第k層,則該結點的後件均處在第k+1層。圖(b)中的樹共有五層。在樹中,父結點在同一層的所有結點構成兄弟關係。

樹中最大的層次稱為樹的深度,亦稱高度。

5、有序樹和無序樹

按照樹中同層結點是否保持有序性,可將樹分為有序樹和無序樹。如果樹中同層結點從左而右排列,其次序不容互換,這樣的樹稱為有序樹;如果同層結點的次序任意,這樣的樹稱為無序樹。

6、樹的表示方法

樹的表示方法一般有兩種:

⑴自然界的樹形表示法:用結點和邊表示樹,例如上圖採用的就是自然界的樹形表示法。樹形表示法一般用於分析問題。

⑵括號表示法:先將根結點放入一對圓括號中,然後把它的子樹按由左而右的順序放入括號中,而對子樹也採用同樣方法處理:同層子樹與它的根結點用圓括號括起來,同層子樹之間用逗號隔開,最後用閉括號括起來。

例如圖可寫成如下形式

(r(a(w,x(d(h),e)),b(f),c(s,t(i(m,o,n),j),u)))

7、樹的儲存結構一般有兩種

⑴靜態的記錄陣列。所有結點儲存在一個陣列中,陣列元素為記錄型別,包括資料域和長度為n(n為樹的度)的陣列,分別儲存該結點的每一個兒子的下標

⑵動態的多重連結串列。由於樹中結點可以有多個元素,所以可以用多重連結串列來描述比較方便。所謂多重連結串列,就是每個結點由資料域和n(n 為樹的度)個指標域共n+1個域組成

下面是有關二叉樹的內容:

二叉樹的概念

二叉樹是一種很重要的非線性資料結構,它的特點是每個結點最多有兩個後件,且其子樹有左右之分(次序不能任意顛倒)。

1、二叉樹的遞迴定義和基本形態

二叉樹是以結點為元素的有限集,它或者為空,或者滿足以下條件:

⑴有一個特定的結點稱為根;

⑵餘下的結點分為互不相交的子集l和r,其中r是根的左子樹;l是根的右子樹;l和r又是二叉樹;

由上述定義可以看出,二叉樹和樹是兩個不同的概念

⑴樹的每一個結點可以有任意多個後件,而二叉樹中每個結點的後件不能超過2;

⑵樹的子樹可以不分次序(除有序樹外);而二叉樹的子樹有左右之分。我們稱二叉樹中結點的左後件為左兒子,右後件為右兒子。

2、二叉樹的兩個特殊形態

⑴滿二叉樹: 如果一棵二叉樹的任何結點,或者是樹葉,或者恰有兩棵非空子樹,則此二叉樹稱作滿二叉樹。可以驗證具有n個葉結點的滿二叉樹共有2n-1個結點。

⑵完全二叉樹:如果一棵二叉樹最多隻有最下面兩層結點度數可以小於2,並且最下面一層的結點都集中在該層最左邊的若干位置上,則稱此二叉樹為完全二叉樹

3、二叉樹的三個主要性質

性質1:在二叉樹的第i(≥1)層上,最多有2i-1個 結點

證明:我們採用數學歸納法證明:當i=1時只有一個根結點,即2i-1=20=1,結論成立。

假設第k(i=k)層上最多有2k-1個結點,考慮i=k+1。由歸納假設,在二叉樹第k層上最多有2k-1個結點,而每一個結點最多有兩個子結點,因此在第k+1層上最多有2.2k-1=2(k+1)-1=2i,結論成立。綜上所述,性質1成立。

性質2:在深度為k(k≥1)的二叉樹中最多有2k-1個 結點。

證明:由性質1,在二叉樹第i層上最多有2i-1個結點,顯然,第1層¨第k層的最多結點數為 個結點。證畢。

性質3:在任何二叉樹中,葉子結點數總比度為2的結點多1。

證明:設n0為二叉樹的葉結點數;n1為二叉樹中度為1的結點數;n2為二叉樹中度為2的結點數,顯然n=n0+n1+n2 (1)

由於二叉樹中除了根結點外,其餘每個結點都有且僅有一個前件。設 b為二叉樹的前件個數,n=b+1(2)

所有這些前件同時又為度為1和度為2的結點的後件。因此又有b=n1+2n2 (3)

我們將(3)代入(2)得出n=n1+2n2+1 (4)

比較(1)和(4),得出n0=n2+1,即葉子數比度為2的結點數多1

4、普通有序樹轉換成二叉樹

普通樹為有序樹t,將其轉化成二叉樹t』的規則如下:

⑴t中的結點與t』中的結點一一對應,即t中每個結點的序號和值在t』中保持不變;

⑵t中某結點v的第一個兒子結點為v1,則在t』中v1為對應結點v的左兒子結點;

⑶t中結點v的兒子序列,在t』中被依次連結成一條開始於v1的右鏈;

由上述轉化規則可以看出,一棵有序樹轉化成二叉樹的根結點是沒有右子樹的,並且除保留每個結點的最左分支外,其餘分支應去掉,然後從最左的兒子開始沿右兒子方向依次連結該結點的全部兒子。

5、二叉樹的儲存結構

將每個結點依次存放在一維陣列中,用陣列下標指示結點編號,編號的方法是從根結點開始編號1,然後由左而右進行連續編號。每個結點的資訊包括

⑴一個資料域(data);

⑵三個指標域,其中有父結點編號(prt)、左兒子結點編號(lch)和右兒子結點編號(rch)。

滿二叉樹和完全二叉樹一般採用順序儲存結構

對於一般的二叉樹,通常採用鏈式分配,即用二重連結串列表示一般的二叉樹。這種鏈式分配即可以採用靜態資料結構(陣列),又可以採用動態資料結構(指標)。如果二叉樹的儲存需求量超過64kb,則採用後者。

由於二叉樹中每個結點通常包括資料元素和兩個分支。因此二叉樹對應的二重連結串列中每個結點應有三個域:

⑴值域: data

⑵左指標域: lch

⑶右指標域: rch

這種連結串列也稱為二叉連結串列。二叉連結串列頭指標bt指向二叉樹的根結點

6、二叉樹的遍歷

二叉樹遍歷的定義:按照一定的規律不重複地訪問(或取出結點中的資訊,或對結點作其它的處理)二叉樹中的每一個結點。

二叉樹遍歷的順序:如果用l、d、r分別表示遍歷左子樹、訪問根結點、遍歷右子樹,則對二叉樹的遍歷可以有下列六種(3!=6)組合:

ldr、 lrd、 dlr、 drl、rdl、 rld。若再限定先左後右的次序,則只剩下三種組合:ldr(中序遍歷)、lrd(後序遍歷)、dlr(前序遍歷)。

前序遍歷的規則如下:

若二叉樹為空,則退出。否則

⑴訪問處理根結點;

⑵前序遍歷左子樹;

⑶前序遍歷右子樹;

特點:由左而右逐條訪問由根出發的樹支 (回溯法的基礎)

中序遍歷的規則:

若二叉樹為空,則退出;否則

⑴中序遍歷左子樹;

⑵訪問處理根結點;

⑶中序遍歷右子樹;

後序遍歷的規則如下:

若二叉樹為空,則退出;否則

⑴後序遍歷左子樹;

⑵後序遍歷右子樹;

⑶訪問處理根結點;

特點:可統計任一個結點為根的子樹的情況(例如子樹的權和,最優策略的選擇(博弈數))

2樓:

每個節點擁有的分支節點不超過2個

——個人理解,書上怎麼說得我忘了

3樓:浪情劍客

關於2x樹的演算法也蠻多的,你要的是哪種演算法?

用2x搜尋樹實現字典?

還是就單單2叉樹的基本演算法?

資料結構二叉樹的遍歷,C語言資料結構 二叉樹的遍歷

前序 根,左兒子,右兒子 中序 左兒子,根,右兒子 後序 左兒子,右兒子,根 首先是要牢記一上幾句話 比如這棵樹的中許遍歷,a有左兒子,先不訪問a,以此類推,直到d沒有左兒子,訪問d,然後訪問d的根b,然後應該訪問b的右兒子,但是b沒有,所以訪問b的根a,訪問完a以後訪問a的右子樹。先看c,c有左兒...

平衡二叉樹的問題,平衡二叉樹 資料結構問題?

圭旻陰安夢 這個問題的中文意思是 任何一個平衡二叉樹,如果它總共有16個結點,那麼它的 最大 深度是多少?解答 我用星號表示結點 平衡二叉樹是這樣的二叉樹 它的左右子樹都是平衡二叉樹,且兩者深度之差不超過1 圖1每個父結點度有左右兩個子結點 答案 a 1.平衡二叉樹解決的是動態問題,靜態的查詢無需平...

資料結構演算法判斷兩棵二叉樹是否等價

網際網路 逸白 include include include typedef char datatype typedef struct node bitree bitree createtree bitree root root bitree malloc sizeof bitree root d...