**:
一、簡介
世界上的樹有千萬種,我們這裡來學習我們資料結構中的樹,它是我們現實生活中倒置的樹。之前,我們學習的順序表,鍊錶,棧、和佇列。可以說都是我們的線性結構,也就是我們所謂的一對一的結構,可是現實生活中,我們經常碰到是我們一對多的情況。今天,我們就來研究一下這種一對多的資料結構體—–「樹」。那麼,什麼叫做樹呢?
二、樹的基本概念簡介
<1>樹的定義
專業定義:(1)有且只有乙個稱為根的結點
(2)有若干不相交的子樹,這些子樹本身也是一顆樹。
通俗講解:
(1)樹由結點和邊組成
(2)樹中除根節點外,每乙個節點都有乙個父結點,但是 可以用多個子節點。
(3)根結點沒有父結點
<2>樹中的專業術語
節點 : 父節點 子節點(老子和兒子) 堂兄弟
度: 結點擁有子樹的個數
葉子節點:沒有子節點的節點
邊 : 乙個節點到另乙個節點的距離
樹的深度:節點的層數, 根節點預設為第一層。
有序 :樹的左右位置不能改變。
<3>樹的分類
一般樹 : 任意乙個結點的子節點的個數不受限制,則稱為一般樹。(子節點可以有多個),如下圖:
二叉樹(重點):任意乙個節點的子節點的個數最多有兩個,且子節點的個數不能更改。
森林:樹去掉根結點就稱之為森林。
提問:在下圖中:
<1>a,b,h,i的度分別是多少?
a:3 b : 2 h: 1 i: 0
<2>葉子節點有哪些?
k ,l,f,g,h,i,j
<3>結點f和i在樹中的第幾層?
f在第3層。
m在第4層
<4>樹的深度是多少?
三、二叉樹的特性講解
<1>二叉樹的性質講解
如下圖是一顆二叉樹,它有一些特性:
思考:第一層最多有多少個? 1個
第二層最多有多少個? 2 個
第三層最多有多少個? 4 ?
規律:第i層結點最後有2的n - 1次方個。
性質1:二叉樹的第i層上的結點最多有2的i - 1次方個節點。
思考:深度為1的二叉樹(遍歷第一層)一共有多少個節點? 1個
深度為2的二叉樹(遍歷到第二層)一共有多少個節點? 3個
深度為3的二叉樹(遍歷到第三層)一共有多少個節點? 7個
規律:深度為k的而出書,最多有2的k次方 - 1個節點。
性質2:深度為k的二叉樹最多有2的k次方-1個結點。
性質3:在任意一棵二叉樹中,樹葉的數目比度數為2的結點的數目多1.
(推導過程入下圖所示:)
<2>二叉樹的分類
滿二叉樹:在一顆二叉樹中,如果所有的分支節點都存在左子樹和右子樹,並且所有的葉子節點都在同一層上,這樣的二叉樹,我們稱之為滿二叉樹。
滿二叉樹的特點:<1>葉子節點只會出現在最下面一層。
<2>非葉子節點的節點,擁有子樹的個數一定為2.
<3>在同樣深度的二叉樹中,滿二叉樹的節點個數最多。
完全二叉樹:對一顆具有n個結點的二叉樹按層進行編號,如果編號為i
(1 <= i <= n)的結點與同樣深度的滿二叉樹節點編號為i的結點
在二叉樹中的位置完全相同,則這顆樹,我們稱之為完全二叉樹。
如下圖所示。
提問:下面這些樹,是完全二叉樹嗎? 不是
總結:滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。
四、二叉樹的儲存
(1)順序儲存[完全二叉樹]
(順序儲存的話,若不是完全二叉樹儲存沒有意義。)
假設下面有一顆樹,我們如何把它存到陣列中呢?
思路:先把轉換成完全二叉樹,然後再編號。
這樣儲存就看似沒有什麼問題。我們可以按照編號把資料儲存到陣列中,我們按照編號(1,2,3,4,5)的順序儲存就可以了啊!這個時候,我就要問了,假說說,我們的m的編號,你怎麼知道我們的3好位置是在下面,而不是在我們的m編號的位置呢?我們的連續儲存無法識別。(這種方法,我們無法推斷樹的結構)。
因此,我們順序儲存規定:
無論是何種樹,我們都會轉換成完全二叉樹。然後一層一層的從左給我們的二叉樹進行編號,然後儲存在陣列中。及如下圖。
那麼我們以上的儲存有什麼規律呢?假設某個節點為i的話,我們來觀察一下。
是不是所有的左孩子都是偶數,所有的右孩子都是奇數啊!
完全二叉樹的特點:
對於編號為i(i>=1)的結點:
(1)左孩子存在:2 * i <= n(節點的個數),左孩子編號
(2)右孩子儲存:2 * i + 1 <= n,右孩子編號 2 * i + 1
(2)鏈式儲存[完全二叉樹]
思考:上述過程,我們的二叉樹應該定義什麼樣的資料型別來儲存結點呢?
<4>二叉樹的遍歷
(1)層次遍歷:從上到下一層一層的遍歷
(2)前序遍歷:根 、左(左子樹)、右(右子樹)
(3)中序遍歷:左(左子樹) 、根 、右(右子樹)
(4)後序遍歷:左(左子樹)、右(右子樹)、根
規則:遇到根結點則輸出,否則遍歷。
層次遍歷:abcdefghi
先序遍歷:abdghceif
中序遍歷:gdhbaeicf
後序遍歷:ghdbiefca
完全二叉樹的遞迴建立思路:
1.首先,寫乙個建立單個節點的函式malloc_bnode,左孩子和右孩子都為空並且填充,我們需要的資料
2.然後寫乙個建立二叉樹的函式create_binarytree()函式。呼叫malloc_bond
函式建立節點,然後判斷結點有沒有左孩子和右孩子。
2 *num <= n ,左孩子存在 (num為我們的結點編號,n為我們的結點個數)
再次,呼叫create_binarytree()建立該編號的孩子。
2 *num + 1 <=n,右孩子儲存。
再次,呼叫create_binarytree()建立該編號的孩子,最後返回根節點。
二叉樹詳解
一 二叉樹的一些概念 二叉樹就是每個結點最多有兩個子樹的樹形儲存結構。先上圖,方便後面分析。1 滿二叉樹和完全二叉樹 上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然後我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子...
二叉樹詳解
樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點 或左孩子和右孩子 並且二叉樹的子樹有左右之分,其次序不能任意顛倒。本篇部落格將詳細為大家解析二叉樹。首先介紹兩個概念 滿二叉樹 在一棵二叉樹中,如果所有分支結點都有左孩子和...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...