1. 程式人生 > >【資料結構】資料結構中常用的樹

【資料結構】資料結構中常用的樹

宣告:本文彙總了資料結構中一些常用的樹,主要內容來自《資料結構(嚴蔚敏版)》和《演算法導論》這兩本教材。本文主要歸納出資料結構中常見的樹的概念與簡單的性質,並未給出具體的操作,如插入、刪除、查詢等。

1、樹的定義

首先給出樹的相關定義:樹(tree)是包含n(n>0)個結點的有窮集,其中:
1)每個元素稱為結點(node);
2)有一個特定的結點被稱為根結點或樹根(root);
3)除根結點之外的其餘資料元素被分為m(m≥0)個互不相交的集合T1,T2,……Tm-1,其中每一個集合Ti(1<=i<=m)本身也是一棵樹,被稱作原樹的子樹。
樹也可以這樣定義:樹是由根結點和若干顆子樹構成的。樹是由一個集合以及在該集合上定義的一種關係構成的。集合中的元素稱為樹的結點,所定義的關係稱為父子關係。父子關係在樹的結點之間建立了一個層次結構。在這種層次結構中有一個結點具有特殊的地位,這個結點稱為該樹的根結點,或稱為樹根。

2、樹的相關術語

節點的度:一個節點含有的子樹的個數稱為該節點的度;
葉節點或終端節點:度為0的節點稱為葉節點;
非終端節點或分支節點:度不為0的節點;
雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點;
孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點;
兄弟節點:具有相同父節點的節點互稱為兄弟節點;
樹的度:一棵樹中,最大的節點的度稱為樹的度;
節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
樹的高度或深度:樹中節點的最大層次;
堂兄弟節點:雙親在同一層的節點互為堂兄弟;
節點的祖先:從根到該節點所經分支上的所有節點;
子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。
森林:由m(m>=0)棵互不相交的樹的集合稱為森林;

下面給出常見的樹的概念,大部分內容可參考嚴蔚敏版《資料結構》:

3、二叉樹

二叉樹是資料結構中一種重要的資料結構,也是樹表家族最為基礎的結構。
二叉樹的定義:二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2i-1個結點;深度為k的二叉樹至多有2k-1個結點;對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。
這裡寫圖片描述

4、滿二叉樹

一棵深度為k且有2k-1(2的k次冪減1)個結點的二叉樹稱為滿二叉樹。
這裡寫圖片描述

5、完全二叉樹

深度為k的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時,稱之為完全二叉樹。
這裡寫圖片描述

6、二叉排序樹

二叉查詢樹定義:又稱為是二叉排序樹(Binary Sort Tree)或二叉搜尋樹。二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
1) 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2) 若它的右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
3) 它的左、右子樹也分別為二叉排序樹。
這裡寫圖片描述

7、平衡二叉樹

平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹。它或者是一棵空樹,或者是具有下列性質的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1。(注:平衡二叉樹應該是一棵二叉排序樹)
這裡寫圖片描述

下面給出高階一點的樹的資料結構,這些樹在面試的時候會被經常提及:

8、B樹

B樹又稱為B-樹,是一種平衡的多路查詢樹。B-樹的階是所有結點的孩子結點樹的最大值。一棵m階B-樹,或為空樹,或為滿足下列特性的m叉樹:
1)樹中每個結點至多有m棵子樹;
2)若根節點不是葉子節點,則至少有兩棵子樹;
3)除根之外的所有非終端結點至少有[m/2]()向上取整)棵子樹;
4)所有的非終端結點中包含下列資訊資料:(n,A0,K1,A1,K2,A2,…,Kn,An),其中,n為結點中的關鍵字樹,A為指向子樹根結點的指標,K為關鍵字,且Ai-1所指子樹中所有結點的關鍵字均小於Ki,An所指子樹中所有結點的關鍵字均大於Kn;
5)所有的葉子結點都出現在同一層次上,並且不帶資訊(可以看作是外部結點或查詢失敗的結點,實際上這些結點不存在,指向這些結點的指標為空)。下圖為一棵4階B-樹:
這裡寫圖片描述

9、B+樹

B+樹是應檔案系統所需而出的一種B-樹的變型樹。一棵m階B+樹和m階的B-樹的差異在於:
1)有n棵子樹的結點中含有n個關鍵字,每個關鍵字不儲存資料,只用來索引,所有資料都儲存在葉子節點;
2)所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結;
這裡寫圖片描述

10、紅黑樹

紅黑樹,一種二叉查詢樹,但在每個結點上增加一個儲存位表示結點的顏色,可以是Red或Black。通過對任何一條從根到葉子的簡單路徑上各個結點的顏色進行約束,紅黑樹確保沒有一條路徑會比其他路徑長出2倍,因而是近似於平衡的。樹中每個結點包含5個屬性:color、key、left、right和p。如果一個結點沒有子節點或父節點,則該結點相應的指標屬性值為NIL,我們可以把這些NIL視為指向二叉搜尋樹的葉節點(外部結點)的指標,而把帶關鍵字的結點視為樹的內部結點。
一棵紅黑樹是滿足下面性質的二叉搜尋樹:
1)每個結點或是紅色的,或是黑色的;
2)根結點是黑色的;
3)每個葉結點(葉結點即指樹尾端NIL指標或NULL結點)是黑的;
4)如果一個結點是紅色的,則它的兩個子結點都是黑色的;
5)對每個結點,從該結點到其所有後代葉結點的簡單路徑上,均包含相同數目的黑色結點。
紅黑樹雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢、插入、刪除的時間複雜度最壞為O(log n)。
這裡寫圖片描述

11、鍵樹

如果一個關鍵字可以表示成字元的序號,即字串,那麼可以用鍵樹(keyword tree),又稱數字搜尋樹或字元樹,來表示這樣的字串的集合。鍵樹的結構受啟發於一部大型字典的“書邊標目”。字典中標出首字母是 A,B,C,…,Z的單詞所在頁,再對各部分標出第二字母為A,B,C,…,Z的單詞所在的頁等等。
鍵樹是一種特殊的查詢樹,它是一棵度大於等於2的樹,樹中的每個節點不是包含一個或幾個關鍵字,而是隻含有組成關鍵字的符號。
比如:如果關鍵字是數值,則節點中只包含一個數位;如果關鍵字是單詞,則節點中只包含一個字母字元。根結點不代表任何字元,根以下第一層的結點對應於字串的第一個字元,第二層的結點對應於字串的第二個字元……每個字串可由一個特殊的字元如“$”等作為字串的結束符,用一個葉子結點來表示該特殊字元。把從根到葉子的路徑上,所有結點(除根以外)對應的字元連線起來,就得到一個字串。因此,每個葉子結點對應一個關鍵字。在葉子結點還可以包含一個指標,指向該關鍵字所對應的元素。整個字串集合中的字串的數目等於葉子結點的數目。如果一個集合中的關鍵字都具有這樣的字串特性,那麼,該關鍵字集合就可採用這樣一棵鍵樹來表示。
鍵樹的儲存通常有兩種方式:
1)用樹的孩子兄弟鏈來表示鍵樹,稱為雙鏈樹;每個Node有三個域:symbol域:儲存關鍵字的一個字元;son域:儲存指向第一棵子樹的根的指標;brother域:儲存指向右兄弟的指標。
2)用多重連結串列來表示鍵樹,稱為Trie樹或字典樹。

12、字典樹

如果以樹的多重連結串列來表示鍵樹,則樹的每個結點應包含d個(d為關鍵字元的基,如:字符集由英文大寫字母構成時,則d=26)指標域,此時的鍵樹又稱為字典樹。
字典樹典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。 
Tire樹的三個基本性質:
1) 根節點不包含字元,除根節點外每一個節點都只包含一個字元;
2) 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串;
3) 每個節點的所有子節點包含的字元都不相同。
Tire樹的應用:
1) 串的快速檢索
給出N個單片語成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。在這道題中,我們可以用陣列列舉,用雜湊,用字典樹,先把熟詞建一棵樹,然後讀入文章進行比較,這種方法效率是比較高的。
2) “串”排序
給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出。用字典樹進行排序,採用陣列的方式建立字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。
3) 最長公共字首
這裡寫圖片描述

13、字尾樹

所謂字尾樹,就是包含一則字串所有後綴的壓縮了的字典樹。先說說字尾的定義。給定一長度為n的字串S=S1S2..Si..Sn,和整數i,1 <= i <= n,子串SiSi+1…Sn都是字串S的字尾。以字串S=XMADAMYX為例,它的長度為8,所以S[1..8],S[2..8], … , S[8..8]都算S的字尾,我們一般還把空字串也算成字尾。這樣,我們一共有如下字尾。對於字尾S[i..n],我們說這項字尾起始於i。
鍵樹只適合字首匹配和全字匹配,並不適合字尾和子串匹配,而後綴樹在這方面則非常合適。它與鍵樹的最大不同在於,字尾樹的單詞集合是由指定字串的字尾子串構成。

14、區間樹與線段樹

區間樹是在紅黑樹基礎上進行擴充套件得到的支援以區間為元素的動態集合的操作,其中每個節點的關鍵值是區間的左端點。通過建立這種特定的結構,可是使區間的元素的查詢和插入都可以在O(lgn)的時間內完成。相比於基礎的紅黑樹資料結構,增加了一個max[x],即以x為根的子樹中所有區間的端點的最大值。
線段樹是一種平衡二叉查詢樹,它將一個區間劃分成一些單元區間,每個單元區間對應線段樹中的一個葉結點。主要的處理思想是基於分治的思想。
設根節點的區間為[a,b),區間長度為L = b - a,線段樹的性質:
1)線段樹是一個平衡樹,樹的高度為log(L);
2)線段樹把區間上的任意長度為L的線段都分成不超過2log(L)線段。

15、敗者樹與勝者樹

勝者樹和敗者樹都是完全二叉樹,是樹形選擇排序的一種變型。在勝者樹、敗者樹中,每個葉子結點相當於一個選手,每個中間結點相當於一場比賽,每一層相當於一輪比賽。不同的是,勝者樹中的每個非終端結點均表示其左、右孩子結點中的“勝者”;而在敗者樹中,父結點中記下剛進行完的這場比賽中的敗者,而讓勝者去參加更高一層的比賽。下圖為一棵實現5路歸併排序的敗者樹:
這裡寫圖片描述