树型结构
樹型結(jié)構(gòu)的基本概念
對(duì)大量的輸入數(shù)據(jù),鏈表的線性訪問時(shí)間太慢,不宜使用。本文探討另外一種重要的數(shù)據(jù)結(jié)構(gòu)----樹,其大部分時(shí)間可以保證操作的運(yùn)行平均時(shí)間復(fù)雜度為O(logN),第一部分先來看一下樹的一些預(yù)備知識(shí)。
首先看一下樹形結(jié)構(gòu)的樣子,下圖代表的是樹型結(jié)構(gòu)的一般形態(tài):
由上圖看得出樹是一些節(jié)點(diǎn)的集合,總結(jié)一下樹的一些基本概念:
1、結(jié)點(diǎn):樹中的數(shù)據(jù)元素都稱之為結(jié)點(diǎn)
2、根:最上面的結(jié)點(diǎn)稱之為根,一顆樹只有一個(gè)根且由根發(fā)展而來,從另外一個(gè)角度來說,每個(gè)結(jié)點(diǎn)都可以認(rèn)為是其子樹的根
3、父親:結(jié)點(diǎn)的上層結(jié)點(diǎn),如圖中,結(jié)點(diǎn)K的父親是E、結(jié)點(diǎn)L的父親是G
4、兄弟:具有相同父親的結(jié)點(diǎn)稱為兄弟,圖中F、G、H互為兄弟
5、結(jié)點(diǎn)的度:結(jié)點(diǎn)所擁有的子樹的個(gè)數(shù)稱之為結(jié)點(diǎn)的度,如結(jié)點(diǎn)B的度為3
6、樹葉:度為0的結(jié)點(diǎn),也叫作終端結(jié)點(diǎn),圖中D、K、F、L、H、I、J都是樹葉
7、分支結(jié)點(diǎn):度不為0的結(jié)點(diǎn),也叫作非終端結(jié)點(diǎn)或內(nèi)部結(jié)點(diǎn),圖中根、A、B、C、E、G都是分支結(jié)點(diǎn)
8、結(jié)點(diǎn)的層次:從根節(jié)點(diǎn)到樹中某結(jié)點(diǎn)所經(jīng)路徑上的分支樹稱為該結(jié)點(diǎn)的層次,根節(jié)點(diǎn)的層次規(guī)定為1,其余結(jié)點(diǎn)的層次等于其父親結(jié)點(diǎn)的層次+1
9、樹的深度:樹中結(jié)點(diǎn)的最大層次數(shù),圖中樹的深度為4
?
二叉樹
上面的是樹的一般形態(tài),下面看一下二叉樹。二叉樹是一棵樹,其中每個(gè)結(jié)點(diǎn)都不能有多于兩個(gè)子樹。
下圖展示了一顆二叉樹:
二叉樹的一個(gè)性質(zhì)是一顆平均二叉樹的深度要比及結(jié)點(diǎn)個(gè)數(shù)N小得多,這個(gè)性質(zhì)很重要,尤其對(duì)于特殊類型的二叉樹即二叉查找樹而言,其深度的平均值是O(logN),這將大大降低查找時(shí)的時(shí)間復(fù)雜度。
當(dāng)然,二叉樹在運(yùn)用得不好的情況下的情況下是有嚴(yán)重的問題的,即:
樹的深度大到了N-1,這樣的情況是絕對(duì)不允許的,這種樹也被稱為不平衡樹。在下一部分的二叉查找樹說明完之后,會(huì)講讓二叉樹帶有自平衡條件,成為平衡樹。
?
二叉查找樹
二叉樹的一個(gè)重要應(yīng)用是在它們查找中的使用。假設(shè)樹中的每個(gè)結(jié)點(diǎn)存儲(chǔ)一項(xiàng)數(shù)據(jù),使得二叉樹成為二叉查找樹的性質(zhì)是:對(duì)于樹中的每個(gè)結(jié)點(diǎn)X,它的左子樹中所有項(xiàng)的值小于X,而它的右子樹中所有項(xiàng)的值大于X,這意味著該樹所有的元素可以用某種一致的方式排序。
如下圖:
這就是一個(gè)二叉查找樹。但是如果我這么修改一下:
這就不是一個(gè)二叉查找樹了,因?yàn)樵诟?jié)點(diǎn)的左子樹中,有一個(gè)節(jié)點(diǎn)是11。
?
AVL樹
前面已經(jīng)講到過了,在生成二叉樹/二叉查找樹的時(shí)候是非常容易失衡的,造成的最壞的情況就是一邊倒(只有左子樹/右子樹),這樣將會(huì)導(dǎo)致樹的檢索效率大大降低,所以為了維持二叉樹的平衡,大牛們提出了各種實(shí)現(xiàn)的算法,如:AVL樹、節(jié)點(diǎn)大小平衡樹(SBT)、伸展樹、樹堆(Treap)、紅黑樹等等。
這里講AVL樹----一種帶有平衡條件的二叉查找樹,這種平衡條件必須要容易保持,而且它保證樹的深度必須是O(logN)。
對(duì)于AVL樹來說,它的平衡必須滿足以下特征之一:
1、空樹
2、每個(gè)結(jié)點(diǎn)的左子樹和右子樹深度最多差1
可以看一下下圖:
圖中,左邊的樹是AVL樹,右邊的樹不是。因?yàn)楹茱@然,從根結(jié)點(diǎn)7看起,右子樹的深度為1,而左子樹7-->2-->4-->5(3)這條路徑深度為3,不滿足每個(gè)結(jié)點(diǎn)的左子樹和右子樹深度最多差1的條件。
可以證明,一顆AVL樹的高度最多為1.44 * log(N + 2) - 1.328,但是實(shí)際上的高度只略大于logN。
?
紅黑樹
紅黑樹是對(duì)AVL樹的另一種變種。紅黑樹顧名思義就是結(jié)點(diǎn)是紅色或者黑色的平衡二叉樹,它通過顏色的約束來維持著二叉樹的平衡。下圖為一顆典型的二叉樹:
對(duì)于一顆有效的紅黑樹而言我們必須增加如下規(guī)則:
1、每個(gè)結(jié)點(diǎn)都只能是紅色或者黑色
2、根節(jié)點(diǎn)是黑色
3、每片葉子都是黑色的
4、如果一個(gè)結(jié)點(diǎn)是紅色的,則它的兩個(gè)子節(jié)點(diǎn)都是黑色的,也就是說在一條路徑上不能出現(xiàn)相鄰的兩個(gè)紅色結(jié)點(diǎn)
5、從任意一個(gè)結(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含著相同數(shù)目的黑色結(jié)點(diǎn)
這些約束強(qiáng)制了紅黑樹的關(guān)鍵性質(zhì):從根到葉子的最長(zhǎng)的可能路徑不多于最短的可能路徑的兩倍長(zhǎng)。結(jié)果就是這棵樹大致上是平衡的,因?yàn)椴迦搿h除和查找某個(gè)值得最壞情況時(shí)間都要求與樹的高度成比例,這個(gè)高度理論上限允許紅黑樹只在最壞情況下都是高效的。
再具體就不說了,可以參看http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html,對(duì)紅黑樹的講解寫得非常好。
對(duì)了,TreeMap和TreeSet就是紅黑樹的典型實(shí)現(xiàn)。
總結(jié)
- 上一篇: 大型网站架构学习笔记
- 下一篇: 面试感悟—-一名3年工作经验的程序员应该