【數據結構】數據結構中常用的樹

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

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路歸併排序的敗者樹:
這裏寫圖片描述

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