前言:樹型結構是一類重要的非線性結構,其特點是結點之間有分支,並具有層次關係。
1.1 基本概念
1.1.1 樹
樹是由n(n≥1)個有限結點組成的一個具有層次關係的集合, 把它叫作“樹”是因爲它看起來像一棵倒掛的樹,也就是說樹是根朝上,而葉朝下的。如圖所示:
它具有以下的特點:
① 每個結點有零個或多個子結點;
② 每個子結點只有一個父結點;
③ 沒有前驅的結點爲根結點;
④ 除了根結點外,每個子結點可以分爲許多個不相交的子樹。
爲方便描述樹的特點,先列出將會涉及到的樹的基本概念:
①結點的度:一個結點含有的子樹個數;
②樹的度:一棵樹中,最大的結點的度;
③葉結點(終端結點):度爲0的結點;
④分支結點(非終端結點):度不爲0的結點;
⑤孩子結點:一個結點的子樹的根結點;
⑥雙親結點(父結點):在含有孩子的結點中,該結點稱爲孩子結點的雙親結點;
⑦兄弟結點:具有相同雙親的結點;
⑧祖先節點:從根到該結點所經分支上的所有結點;
⑨子孫結點:以某結點爲根的子樹中任意結點;
⑩節點的層次:從根開始定義,根爲第一層,根的孩子爲第二層,以此類推。如下圖所示:
⑪樹的高度(深度):樹中結點的最大層次;
⑫路徑:從根結點到某一結點的一條通道;
⑬路徑長度:路徑經過的邊的個數。如下圖所示:
1.1.2 二叉樹
1.綜述:二叉樹是每個結點最多有兩個子樹的有序樹,通常子樹的根被稱爲“左子樹”和“右子樹”。如下圖所示。二叉樹是一種最簡單的樹結構,任何樹都可以簡單轉換爲二叉樹。
2.樹和二叉樹的區別
①樹的結點個數至少爲1,而二叉樹的結點個數可以爲0;
②樹中結點的最大度數沒有限制,而二叉樹結點最大度數爲2;
3.兩種特殊的而二叉樹
(1)滿二叉樹
滿二叉樹中所有的葉節點都在最後一層,而其他分支結點的度數都爲2。示例如下:
(2)完全二叉樹
若一個二叉樹扣除其最後一層後變成一個滿二叉樹,且最後一層的所有結點都向左靠齊,則稱該二叉樹爲完全二叉樹。示例如下:
★滿二叉樹一定爲完全二叉樹,完全二叉樹不一定爲滿二叉樹
3.二叉樹常見的性質
性質1 一顆非空二叉樹的第i層上最多有2i-1個結點(i≥1)
性質2 深度爲h的二叉樹最多有2h-1個結點(h>1)
性質3 對於任何一棵二叉樹T,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0=n2+1
性質4 若一個正則二叉樹(只有度爲0和2結點的二叉樹)中有n個葉子結點,則該二叉樹結點總數爲log2n(由 性質2 推導)
性質5 對於具有n個結點的完全二叉樹,如果如果按照從上到下、同一層次上的結點按從左 到右的順序對二叉樹中的所有結點從1開始順序編號,則對於序號爲i的結點,有
① 如果i>1,則序號爲i的結點其雙親結點的序號爲[i/2] ([i/2] 表示對i/2的值取整); 如果i=1,則結點i爲根結點,沒有雙親
② 如果2i>n,則結點i無左孩子(此時結點i爲終端結點);否則其左孩子爲結點2i
③ 如果2i+1>n,則結點i無右孩子;否則其右孩子爲結點2i+1
1.1.3 森林
由m(m≥0)棵互不相交的樹構成的集合稱爲森林。如下圖所示,該森林由三棵樹所構成:
1.2 基本操作
1.2.1 樹的遍歷
1.前序遍歷
①訪問根結點;
②按照從左到右的順序前序遍歷根結點的每一棵子樹。
2.後序遍歷
①按照從左到右的順序後序遍歷根結點的每一棵子樹;
②訪問根結點。
3.層序遍歷(廣度遍歷)
從樹的第一層(也就是根結點)開始自上而下逐層遍歷,每一層按照從左到右的順序逐個訪問結點。
下圖展示了按照這三種遍歷方式所對應的遍歷結果:
1.2.2 二叉樹的遍歷
1.前序遍歷
①訪問根結點
②前序遍歷訪問根結點的左子樹
③前序遍歷訪問根結點的右子樹
2.中序遍歷
①中序遍歷訪問根結點的左子樹
②訪問根結點
③中序遍歷訪問根結點的右子樹
3.後序遍歷
①後序遍歷訪問根結點的左子樹
②後序遍歷訪問根結點的右子樹
③訪問根結點
4.層序遍歷
按照從上到下,同一層次從左到右的順序訪問二叉樹
下圖展示了一棵二叉樹四種遍歷方式的結果:
★由二叉樹的前序(後序)序列和中序序列可以唯一確定一棵二叉樹,但是只由前序序列和後序序列不能確定一棵二叉樹。
1.2.3 森林的遍歷
1.前序遍歷
若森林非空,則:
①訪問森林中第一棵樹的根結點
②前序遍歷第一棵樹中根結點的每一棵子樹
③前序遍歷除第一棵樹外的其他樹
2.後序遍歷
若森林非空,則:
①後序遍歷第一棵樹的根結點的各個子樹
②訪問第一棵樹的根結點
③後序遍歷除第一棵樹外的其他樹
下圖給出了一個三棵樹的森林的兩種遍歷結果:
★根據森林,樹和二叉樹的關係,可以得知:
①前序遍歷森林=前序遍歷該森林對應的二叉樹
②後序遍歷森林=中序遍歷該森林所對應的二叉樹
③前序遍歷樹=前序遍歷該樹所對應的二叉樹
④後序遍歷樹=中序遍歷該樹所對應的二叉樹
1.2.4 樹、森林和二叉樹的轉換
1.樹、森林轉換成二叉樹
①在所有兄弟之間加一條線
②對每個結點,去掉該結點和除長子外與其他孩子的連線
樹轉換爲二叉樹如下圖所示:
森林轉換成二叉樹如下圖所示:
2.二叉樹轉換成樹、森林
若結點x是雙親y的左孩子,則把x的右孩子、右孩子的右孩子都與y連起來,最後去掉雙親到右孩子的連線。如圖所示: