1. 程式人生 > >資料結構--樹及相關特性

資料結構--樹及相關特性

1.  樹及相關特性

1.1. 樹的概念

樹形結構是一類重要的非線性結構。樹形結構是結點之間有分支,並具有層次關係的結構。它非常類似於自然界中的樹。

樹結構在客觀世界中是大量存在的,例如家譜、行政組織機構都可用樹形象地表示。

樹在計算機領域中也有著廣泛的應用,例如在編譯程式中,用樹來表示源程式的語法結構;在資料庫系統中,可用樹來組織資訊;在分析演算法的行為時,可用樹來描述其執行過程。

在計算機領域中被大量應用的樹結構主要有:二叉查詢樹(Binary Search Tree),平衡二叉查詢樹(Balanced Binary Search Tree),紅黑樹(Red-Black Tree ),B-tree/B+-tree/ B*-tree。檔案系統和資料庫系統中常常使用B/B+ 樹,他通過對每個節點儲存個數的擴充套件,使得對連續的資料能夠進行較快的定位和訪問,能夠有效減少查詢時間,提高儲存的空間區域性性從而減少IO操作。他廣泛用於檔案系統及資料庫中,如:

  • Windows:HPFS檔案系統
  • Mac:HFS,HFS+檔案系統
  • Linux:ResiserFS,XFS,Ext3FS,JFS檔案系統
  • 資料庫:ORACLE,MYSQL,SQLSERVER等中

 通過本文將記錄本人最近複習演算法及資料結構中相關樹及常見的樹結構的儲存表示及其各種運算,文中的觀點及結論均來自網際網路和相關的書籍,並通過本人自己的實踐及除錯。

1.1.1.  家族樹

在現實生活中,有入如下血統關係的家族可用樹形圖表示:

  • 張源有三個孩子張明、張亮和張麗;
  • 張明有兩個孩子張林和張維;
  • 張亮有三個孩子張平、張華和張群;
  • 張平有兩個孩子張晶和張磊。


以上表示很像一棵倒畫的樹。其中"樹根"是張源,樹的"分支點"是張明、張亮和張平,該家族的其餘成員均是"樹葉",而樹枝(即圖中的線段)則描述了家族 成員之間的關係。顯然,以張源為根的樹是一個大家庭。它可以分成張明、張亮和張麗為根的三個小家庭;每個小家庭又都是一個樹形結構。

1.1.2.  樹的定義

樹的遞迴定義:

樹(Tree)是n(n≥0)個結點的有限集T,T為空時稱為空樹,否則它滿足如下兩個條件:

1)  有且僅有一個特定的稱為根(Root)的結點;

2)  其餘的結點可分為m(m≥0)個互不相交的子集Tl,T2,…,Tm,其中每個子集本身又是一棵樹,並稱其為根的子樹(Subree)。

如上圖所示,A點稱為根節點,它有兩棵子樹,分別以B、C為根,而以C為根的子樹又可以分成兩棵子樹。

  注意:

   樹的遞迴定義刻畫了樹的固有特性:一棵非空樹是由若干棵子樹構成的,而子樹又可由若干棵更小的子樹構成。

1.2. 樹的表示

1)   樹形圖表示

樹形圖表示是樹結構的主要表示方法。

樹的樹形圖表示中:結點用圓圈表示,結點的名字寫在圓圈旁邊(有時亦可寫在圓圈內)。

用該定義來分析上圖(a)所示的樹:

圖中的樹由結點的有限集T={A,B,C,D,E,F,C,H,I,J}所構成,其中A是根結點,T中其餘結點可分成三個互不相交的子集:

         T1={B,E,F,I,J},

         T2={C},

         T3={D,G,H}。

T1、T2和T3是根A的三棵子樹,且本身又都是一棵樹。例如T1,其根為B,其餘結點可分為兩個互不相交的的子集T11={E}和T12={F,I,J},它們都是B的子樹。顯然T11是隻含一個根結點E的樹,而T12的根F又有兩棵互不相交的子樹{I}和{J},其本身又都是隻含一個根結點的樹。

2)   樹的其他表示法

①巢狀集合表示法

是用集合的包含關係來描述樹結構。

上圖(a)樹的巢狀集合表示法如圖(b)

②凹入表表示法

 類似於書的目錄,上圖(a)樹的凹入表示法如圖(c)

③廣義表表示法

用廣義表的形式表示的。上圖(a)樹的廣義表表示法如圖(d)

  (A(B(E,F(I,J)),C,D(G,H)))

1.3. 樹結構的基本術語 

1)   不同的節點:根節點、內部節點、葉子節點以及節點的度(Degree)

  • 樹中的一個結點擁有的子樹數稱為該結點的度(Degree)。
  • 一棵樹的度是指該樹中結點的最大度數。
  • 度為零的結點稱為葉子(Leaf)或終端結點。
  • 度不為零的結點稱分支結點或非終端結點。
  • 除根結點之外的分支結點統稱為內部結點。
  • 根結點又稱為開始結點。

2)   節點的關係:孩子(Child)和雙親(Parents)

  • 樹中某個結點的子樹之根稱為該結點的孩子(Child)或兒子,相應地,該結點稱為孩子的雙親(Parents)或父親。
  • 同一個雙親的孩子稱為兄弟(Sibling)。

3)   祖先(Ancestor)和子孫(Descendant)

A.   路徑(path)

  • 若樹中存在一個結點序列k1,k2,…,ki,使得ki是ki+1雙親(1≤i<j),則稱該結點序列是從kl到kj的一條路徑(Path)或道路
  • 路徑的長度指路徑所經過的邊(即連線兩個結點的線段)的數目,等於j-1。

  注意:

若一個結點序列是路徑,則在樹的樹形圖表示中,該結點序列"自上而下"地通過路徑上的每條邊。

從樹的根結點到樹中其餘結點均存在一條惟一的路徑。

B.  祖先(Ancestor)和子孫(Descendant)

  • 若樹中結點k到ks存在一條路徑,則稱k是ks的祖先(Ancestor),ks是k的子孫(Descendant)。
  • 一個結點的祖先是從根結點到該結點路徑上所經過的所有結點,而一個結點的子孫則是以該結點為根的子樹中的所有結點。

約定:

結點k的祖先和子孫不包含結點k本身。

4)   結點的層數(Level)和樹的高度(Height)

     

結點的層數(Level)從根起算:

  • 根的層數為1
  • 其餘結點的層數等於其雙親結點的層數加1。
  • 雙親在同一層的結點互為堂兄弟
  • 樹中結點的最大層數稱為樹的高度(Height)或深度(Depth)。

  注意:

很多文獻中將樹根的層數定義為0。

5)   有序樹(OrderedTree)和無序樹(UnoderedTree)

若將樹中每個結點的各子樹看成是從左到右有次序的(即不能互換),則稱該樹為有序樹(OrderedTree);否則稱為無序樹(UnoderedTree)。

  注意:

若不特別指明,一般討論的樹都是有序樹。

6)   森林(Forest)

森林(Forest)是m(m≥0)棵互不相交的樹的集合。

樹和森林的概念相近。刪去一棵樹的根,就得到一個森林;反之,加上一個結點作樹根,森林就變為一棵樹。

1.4. 樹形結構的邏輯特徵

樹形結構的邏輯特徵可用樹中結點之間的父子關係來描述:

1)   樹中任一結點都可以有零個或多個直接後繼(即孩子)結點,但至多隻能有一個直接前趨(即雙親)結點。

2)   樹中只有根結點無前趨,它是開始結點;葉結點無後繼,它們是終端結點。

3)   祖先與子孫的關係是對父子關係的延拓,它定義了樹中結點之間的縱向次序。

4)   有序樹中,同一組兄弟結點從左到右有長幼之分。

對這一關係加以延拓,規定若k1和k2是兄弟,且k1在k2的左邊,則kl的任一子孫都在k2的任一子孫的左邊,那麼就定義了樹中結點之間的橫向次序。