數據結構之樹的初探

前言

這次我們學習樹和二叉樹,樹是一種一對多的非線性結構


一.樹導學

1.知識點線索

(概述)
第1章 數據結構、ADT、算法

(基礎)
(線性結構)
第2章 線性表
第3章 棧和隊列
第4章 字符串
第5章 數組與廣義表
(非線性結構)
第6章 樹和二叉樹
第7章 圖

(應用)
第9章 查找
第10章 內部排序
第11章 外部排序

2.知識點搜素

樹這一章依然是看他的兩種存儲結構,以及在這兩種結構上所進行的操作,從而再討論算法,但是我們要重點掌握對樹來說十分重要操作——遍歷.

在這裏插入圖片描述

3.主要內容

樹這裏需要掌握的內容有很多

在這裏插入圖片描述

4.樹的應用

樹的應用是普遍存在的,比如圖譜樹狀圖分支圖,還有比較常見的在計算機中的文件管理器,像是一顆倒着的樹。樹的特點很明顯是一對多:一個點對應着多個分支。

在這裏插入圖片描述

在這裏插入圖片描述

二.樹的定義

(在這裏我們討論的樹是一顆倒着的樹)

在這裏插入圖片描述

在這裏插入圖片描述

1.樹的定義

樹:T={D,R}

(1)樹的形式化定義用T來定義,主要包括D和R兩部分,D是數據,R是關係。D中的數據我們把它叫做結點,(樹中的結點就是他的數據)R是指結點和結點之間一對多的關係。通過這些結點和他們之間的關係來描繪出一顆樹。

D={A,B,C,D,E,F,G,H,I,J,K,L,M}
R={r}
① r={<A,B>,<A,C>,<A,D>,<B,E>,<B,F>,<C,G>,<D,H>,<D,I>,<G,J>,<I,K>,<I,L>,<I,M>}

在這裏插入圖片描述

(2)D是包含n個節點的有窮集合(n≥0)
當n=0時爲空樹
當n>0時,關係R滿足以下一對多條件:

① 有且僅有一個節點d0∈D沒有前驅節點,節點d0稱作樹的根節點
② 除節點d0外,D中的每個節點有且僅有一個前驅節點
③ D中每個節點可以有零個或多個後繼節點
(有0個節點我們把它叫做葉子,除了葉子以外其他節點都有多個後繼)

(3)總結:
樹(Tree)是n(n≥0)個結點的有限集,或爲空樹(n = 0),或爲非空樹(n>0)。

對於非空樹T:
① 有且僅有一個稱之爲根的結點;
②除根結點以外的其餘結點可分爲m(m>0)個互不相交的有限集T1, T2, …, Tm, 稱爲根的子樹(SubTree)。

在這裏插入圖片描述
(4)由樹的定義想到了——遞歸思想

在上棵樹建立的過程我們可以看出來,A結點爲根節點,他還包括T1,T2,T3這三棵子樹,這實際上體現了遞歸的思想,一棵樹的建立是由結點構成的多個子樹構成的。

2.樹的表示法

(1)樹形表示法:又叫做直觀表示法。
樹的表示法有多種,最常用的最普通的就是這種直觀表示法,也就是用圓圈代表着每個結點,結點和結點之間用線相連表示結點之間的關係。

在這裏插入圖片描述
(2)文氏圖表示法:又叫嵌套集合表示法。
A這棵樹被看作是一個大集合,這個集合中A是根,除了A這個根以外還有三個紫色的集合,也就是三棵子樹了,每棵子樹都有一個根,然後又包括他其中有幾顆子樹。
在這裏插入圖片描述

(3)凹入表示法:又叫目錄表示法。
把一棵樹看成了一篇文章一本書,這本書又分成了不同的章,每章又分爲不同的節,然後依次凹入進去

在這裏插入圖片描述

(4)括號表示法:又叫做廣義表表示法。
括號外A是根,括號括起來的是用逗號來隔開的三棵子樹,而每棵子樹又有他的根,然後括號括起來了。

在這裏插入圖片描述

3.樹的基本術語

在這裏插入圖片描述

➢ 根:根結點(沒有前驅) : (A)
➢ 葉子:即終端結點(沒有後繼) : ( KLFGHIJ)
➢ 森林:指m棵不相交的樹的集合(例如刪除A後的子樹個數 BCD三棵子樹)
➢ 有序樹:結點各子樹從左至右有序,不能互換(左爲第一棵子樹)
➢ 無序樹:結點各子樹可互換位置。

➢ 結點:即樹的數據元素(一般用圓圈表示,元素一般寫到圓圈裏面)
➢ 結點的度:結點掛接的子樹數(比如A的度爲3,C的度爲1)
➢ 結點的層次:從根到該結點的層數(根結點算第一層)
➢ 終端結點:即度爲0的結點,即葉子
➢ 分支結點:即度不爲0的結點(也稱爲內部結點,非葉子)
➢ 樹的度:所有結點度中的最大值(這棵樹中A和D的度最大,均爲3,所以這棵樹的度爲3)
➢ 樹的深度(或高度):指所有結點中最大的層數(也就是從根節點開始數幾層,你會發現樹狀結構實際上是一種層次結構)

(有趣的術語,很像生活中我們的稱呼)
➢ 雙親:即上層的那個結點(直接前驅) (比如B結點的雙親就是A)
➢ 孩子:即下層結點的子樹的根(直接後繼) (孩子就是雙親反過來,比如A的孩子是BCD)
➢ 兄弟:同一雙親下的同層結點(孩子之間互稱兄弟)(比如BCD互爲兄弟)
➢ 堂兄弟:即雙親位於同一層的結點(但並非同一雙親)(比如FG互爲堂兄弟)
➢ 祖先:即從根到該結點所經分支的所有結點
➢ 子孫:即該結點下層子樹中的任一結點

4.樹的ADT(抽象數據類型)

ADT Tree
{
數據對象:
D = {ai | ai∈ElemType, i=1,2,…,n, n≧0 } //ElemType爲類型標識符

數據關係:
R =
{<ai,aj> | ai, aj∈D, i=1,2,…,n, j=1,2,…,n,其中每個元素只有一個前驅節點,可以有零個或多個後繼節點,有且僅有一個元素(根節點)沒有前驅節點
}

數據操作:
(1)初始化樹InitTree(&t):構造一個空的樹t
(2)銷燬樹DestroyTree(&t):釋放樹t佔用的內存空間
(3)求雙親節點Parent(t):求t所指節點的雙親結點
(4)求子孫節點Sons(t):求t所指節點的子孫節點
… …
}

樹的運算主要分爲三大類:
第一類,尋找滿足某種特定關係的節點,如尋找雙親節點。
第二類,插入或刪除某個節點,如在樹的當前節點上插入一個新節點或刪除當前節點的第i個孩子節點等。
第三類,遍歷樹中每個節點。

5.樹的遍歷

在這裏插入圖片描述
(1)什麼是遍歷?
①按照一定次序訪問樹中所有節點,並且每個節點僅
被訪問一次的過程。
② 遍歷是最基本的運算,是樹中所有其他運算的基礎。

(2) 樹有三種遍歷方式
① 先根遍歷:若樹不空,則先訪問根節點,然後依次
先根遍歷(都是先從左開始)各棵子樹。
ABEFCGJDHIKLM

②後根遍歷:若樹不空,則先依次後根遍歷各棵子樹,
然後訪問根節點。
EFBJGCHKLMIDA

③ 層次遍歷:若樹不空,則自上而下自左至右訪問樹
中每個節點。
ABCDEFGHIJKLM

(我們通常把先根遍歷和後根遍歷稱爲樹的深度優先遍歷,而層次遍歷稱爲廣度優先遍歷)

6.討論——樹的結構

樹的邏輯結構:
(1)討論1:樹的邏輯結構(特點)
①一對多(1:n);
②有多個直接後繼,但只有一個根結點;
子樹之間互不相交

樹的存儲結構:
(1)討論1:樹是非線性結構,該怎樣存儲?
仍然有順序存儲、鏈式存儲方式。

(2)討論2:樹的順序存儲方案應該怎樣制定?
①可規定爲:從上至下、從左至右將樹的結點依次存入內存;
②重大缺陷:復原困難(不能唯一復原的話就沒有實用價值)。

(3)討論3:樹的鏈式存儲方案應該怎樣制定?
①可用多重鏈表:一個前趨指針,n個後繼指針。
②細節問題:樹中結點的樣式該如何設計? “等長”?“不等長”?
③缺點:
等長結構太浪費(每個結點的度不一定相同);
不等長結構太複雜(要定義好多種結構類型)。


後續

從樹的存儲結構我們可以看出,無論是順序存儲還是鏈式存儲,樹的存儲都很複雜,所以我們想到一種解決方法:
解決思路:先研究最簡單、最有規律的樹——二叉樹,然後把一般的樹轉化爲簡單樹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章