資料結構之二叉樹 概念

2021-07-03 22:22:45 字數 3306 閱讀 3310

樹的定義:

樹是n個結點的有限集。 n = 0 稱為空樹。如果n>0,則:

(1)有乙個特定的稱之為根的結點,它只有直接後繼,但沒有直接前驅。

(2)除根以外的其他結點劃分為m個互不相交的有限集合,每個集合又是一棵樹,並且稱之為根的子樹。每棵子樹的根節點有且僅有乙個直接前驅,但可以有0個或多個直接後繼。

節點:表示樹中的元素,包括資料元素的內容及其指向其子樹的分支。

節點的度:節點的分支數。

終端節點(葉子節點):度為0的節點。

非終端節點:度不為0的結點。

節點的層次:樹中根節點的層次為1,根節點子樹的根為第二層,以此類推。樹中結點的最大層次稱為樹的深度或高度。

有序樹、無序樹:如果樹中每棵子樹從左向右的排列擁有一定的順序,不得互    換,則稱為有序樹,否則稱為無序樹。

在樹結構中,節點之間的關係又可以用家族關係描述。

(1)孩子、雙親:某個結點的子樹稱為這個結點的孩子,而這個結點又被稱為孩子的雙親。

(2)子孫:以某節點為根的子樹中的所有節點都被稱為該節點的子孫。

(3)兄弟:同乙個雙親的孩子之間互為兄弟。

(4)堂兄弟:雙親在同一層的節點互為堂兄弟。

樹的儲存:雙親表示法  孩子表示法  雙親孩子表示法

1、二叉樹的定義

二叉樹(binary tree)是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者

由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。

1.1 二叉樹的特點 

二叉樹的特點有: 

1)每個結點最多有兩棵子樹,所以二叉樹中不存在度大於2的結點。注意不是只有兩棵子樹,而是最多有。沒有子樹或者有一棵子樹都是可以的。 

2)左子樹和右子樹是有順序的,次序不能任意顛倒。  3)

即使樹中某結點只有一棵子樹,也要區分它是左子樹還是右子樹

。1.2 特殊二叉樹

1、斜樹

所有的結點都只有左子樹的二叉樹叫左斜樹。所有結點都是只有右子樹的二叉樹叫右斜樹。這兩者統稱為斜樹。

斜樹有很明顯的特點:就是每一層都只有乙個結點,結點的個數與二叉樹的深度相同。 這也叫樹,與線性表結構不是一樣?其實線性表結構就可以理解為是樹的一種極其特殊的表現形式 

2、滿二叉樹

在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹。 單是每個節點都存在左右子樹,不能算是滿二叉樹,還必須要所有的葉子都在同一層,這就做到了整棵樹的平衡。

滿二叉樹的特點是: 

1)葉子結點只能出現在最下一層。出現在其它層就不可能達到平衡。 

2)非葉子結點的度一定是2。 

3)在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多。

3、完全二叉樹

對一棵具有n個結點的二叉樹按層序編號,如果編號為i(1<=i<=n)的結點域同樣深度的滿二叉樹編號為i的結點在二叉樹中的位置完全相同,則這棵二叉樹稱為完全二叉樹。 

滿二叉樹一定是一棵完全二叉樹,但完全二叉樹不一定是滿的。

按照層序編號,出線位置編號空檔,所以不是完全二叉樹。儘管不是滿二叉樹,但是編號是連續的,所以它是完全二叉樹。

完全二叉樹的特點: 

1)葉子結點只能出現在最下兩層 

2)最下層的葉子一定集中在左部連續位置

3)倒數二層,若有葉子結點,一定都在右部連續位置 

4)如果結點度為1,則該結點只有左孩子,即不存在只有右子樹的情況 

5)同樣結點樹的二叉樹,完全二叉樹的深度最小

判斷某二叉樹是否是完全二叉樹的辦法:那就是看著樹的示意圖,心中默默給每個節點按照滿二叉樹的結構逐層順序編號,如果編號出現空檔,就說明不是完全二叉樹。

2、二叉樹的性質

性質1:在二叉樹的

第i層上至多有2

i-1個

結點(i>=1)

性質2:

深度為k的二叉樹至多有2

k -1個結點

(i>=1)

性質3:

對於任何一棵二叉樹t,如果其終端結點數字n

0,度為2的結點數字n

2,則n0=n

2+1。終端節點數就是葉子節點數,而一顆二叉樹,除了葉子節點外,剩下的就是度為

1或2的結點數了。

性質4:

具有n個結點的完全二叉樹的深度為|log

2n| + 1(|x|表示不大於x的最大整數)

性質5:如果對一棵有n個結點的完全二叉樹(其深度為|log

2n| + 1)的結點按層序編號(從第1層到第|log

2n| + 1層,每層從左到右),對任一結點i(1<=i<=n)

有:1)如果i=1,則結點i為二叉樹的根,無雙親;

如i>1,則其雙親是結點|i/2|

2)如果

2i>n

,則結點i無左孩子(結點i為葉子結點);否則其左孩子是結點2i

3)如果

2i+1>n

,則結點i無右孩子;否則其右孩子是結點2i+1

3、二叉樹的儲存結構

3.1 二叉樹的順序儲存結構

二叉樹的順序儲存結構就是用一維陣列儲存二叉數中的結點,並且結點的儲存位置,也就是陣列的下標要能體現結點之間的邏輯關係,比如雙親與孩子的關係、左右兄弟的關係等。

先來看看完全二叉樹的順序儲存,一棵完全的二叉樹如下圖所示。

將這棵二叉樹儲存到陣列中,相應的下標對應其同樣的位置,如下圖所示。

當然,對於一般的二叉樹,儘管層序編號不能反映邏輯關係,但是可以將其按完全二叉樹編號,只不過,把不存在的結點設定為"^"而已。如下圖所示,注意淺色結點表示不存在。

考慮一種極端的情況,

一棵深度為k的右斜樹,它只有k個結點,卻需要分配2

k-1個儲存單元空間,這顯然是對儲存空間的浪費

。所以,順序儲存結構一般只用於完全二叉樹。

3.2 二叉鍊錶

既然順序儲存適應性不強,就要考慮

鏈式儲存結構

。二叉樹每個結點最多有兩個孩子,所以為它設計乙個資料域和兩個指標域是比較自然的想法

,稱這一的鍊錶叫做

二叉鍊錶

。以下是二叉鍊錶的結點結構定義**。12

3456

/* 二叉樹的二叉鍊錶結點定義 */

typedef

struct bitnode                        /*結點結構*/

bitnode, *bitree;

結構示意圖如下所示。

data是資料域,lchild和rchild都是指標域,分別存放指向左孩子和右孩子的指標。

如果有需要,我們可以再增加乙個指向其雙親的指標域,那樣就稱之為三叉鍊錶。

參考:嚴蔚敏老師之《資料結構》、

程杰之《大話資料結構》

資料結構之二叉樹

在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...

資料結構之二叉樹

定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...

資料結構之二叉樹

來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...