數據結構:樹系列(一)類型與概念


自述:

  初次寫博客,本來呢不知到寫些什么,所以創建博客以來,也涼了好幾天,但最近刷題時碰到樹相關的題,說真的做的頭有點大,於是開始惡補樹的相關知識,未免忘記,就開啟了我的博客之旅,當然我還是一個小白,內容啥的也非全原創,基本上是書上知識加上博客上一些大佬的總結,按照自己的閱讀習慣整理了一邊,自我感覺我寫的應該通熟易懂,哈,就這樣吧,省的說我刷字數,雖然想法是這樣的,哈,大家心照不宣啊,我是小白一枚,小仙在此向各位大佬虛心求教,有什么不對的,請在下方評論去加以指正,我會及時改正的,嗯應該不會有錯的吧。。。

正文:

 

樹與子樹

  樹,何為樹?按照書上的定義來說

1 樹就是n個結點的有限集合。當n=0時便為空樹。(n>=0 2 任意一顆非空樹應該滿足: 3 (1)有且僅有一個特定的稱為根(Root)的節點; 4 (2)當n>1時,其余結點可分為m(m>0)個互不相交的有限集T1、T2、......、Tn,其中每一個集合本身又是一棵樹,並且稱為根的子樹

  從定義來看,已經簡單明了,擱在現實中就是一顆倒掛的樹,倒掛的樹的頂部是根,在往下是枝干,枝丫,葉子啥的。如果說從定義上不懂,那么有一種表達方式肯定能懂,話不多說直接曬圖:

         這是樹               這也是樹

  相信這些應該可以讓你了解什么是樹,若還不能了解,當我沒說,繼續往下看

  了解了樹,那么肯定要了解樹的相關術語,要不然別人問你,你不知道那怎么辦,想裝逼都裝不成,只能躲在角落畫圈圈。。。

樹的相關術語

  • 結點 (node):  包含一個數據元素及若干指向其子樹的分支
  • root根結點:    樹的最開始的結點
  • 父結點:      當前結點擁有上一級結點時,上一級的結點便是當前結點的父結點
             (子結點只能擁有一個父結點)
  • 子結點:      當前結點擁有下一級結點時,下一級的結點便是當前結點的子結點
             (父結點能擁有多個子結點)
  • 孩子:        一個結點的直接后繼稱為該結點的孩子。
  • 雙親:        一個結點的直接前驅稱為該結點的雙親。
  • 兄弟:        同一雙親結點的孩子結點之間互稱為兄弟。
  • 祖先:        從根到該結點所經分支上的所有結點,
  • 子孫:        一個結點的直接后繼和間接后繼的所有結點
  • 堂兄弟:      其雙親在同一層的結點。
  • 葉子結點:     樹中度為0的結點,沒有子結點的結點。
             (可以理解為樹的葉子,嗯現實中的,嘻嘻)
  • 分支結點:     樹中不為0的結點,也稱非終端結點。(有子結點的結點)
  • 子樹:         假設有兩顆樹 A和B ,A包含B,那么B便是A的子樹
  • 路徑:        從root節點找到該節點的路線
  • 有序樹
  • 結點的度:     結點擁有的子樹數目稱為度,即擁有子結點的數量    
  • 樹的度:       樹中所有結點的度的最大值。    
  • 結點的層次:    從樹根開始定義,根結點時第1層,那么它的子結點便是第2層,以此類推
  • 樹的深度:     樹中結點的最大層次數稱為樹的深度或高度
             (將樹比作樓房,樹的深度就是說樓有多少層)
  • 森林

   或許,這樣子表達你會有點懵,仿佛有種它認識你,你不認識它的感覺,別灰心,哥向來都是拿圖說話的,來人把我的圖拿上來:

  

 

 

 

 

    嗯,大家有何不懂的可以結合這張圖,對術語品一品,細品。雙管之下,有何難!!!!!  

樹的類型

     對於樹的類型,網上有很多關於它的介紹,但感覺好亂,有點強迫症的我更形象為它分為兩類,二叉樹與多叉樹。

    顧名思義:二叉樹:就是有且僅有兩個分叉的樹,而多叉樹當然是有很多分叉的樹。

              其中二叉樹在樹這種 數據結構更為常用,所以我了解更多的也是二叉樹,在此,我為大家列舉下二叉樹與多叉樹的代表樹,並為它們簡單介紹

    二叉樹:

      線索化二叉樹,二叉排序樹,平衡二叉樹,赫夫曼樹,紅黑樹

    多叉樹:

      B-樹、B+樹、字典樹(trie樹)、后綴樹、廣義后綴樹。

    

各種樹的介紹  

線索化二叉樹

簡介
對於一個有n個節點的二叉鏈表,每個節點有指向左右節點的2個指針域,整個二叉鏈表存在2n個指針域。而n個節點的二叉鏈表有n-1條分支線,那么空指針域的個數=2n-(n-1) = n+1個空指針域。利用二叉鏈表中的空指針域,存放指向該節點在某種遍歷次序下的(一個節點的前一個節點稱為前驅節點)前驅和后繼節點(一個節點的后一個節點稱為后繼節點)的指針( 這種附加的指針稱為“線索”)。加上了這種指針的二叉鏈表稱為線索鏈表,相應的二叉樹稱為線索二叉樹(ThreadBinaryTree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹,中序線索二叉樹,后序線索二叉樹這三種。
線索二叉樹例圖
通過觀察上圖(藍色虛線代表后繼、綠色虛線代表前驅),可以看出,線索二叉樹,等於是把一棵二叉樹轉變成了一個“特殊的雙向鏈表“
如圖:
    
仔細分析上面的雙向鏈表,與線索化之后的二叉樹相比,比如節點D與后繼節點I,在完成線索化之后,並沒有直接線索指針,而是存在父子節點的指針;節點A與節點F,在線索化完成之后,節點A並沒有直接指向后繼節點F的線索指針,而是通過父子節點遍歷可以找到最終的節點F,前驅節點也存在同樣的問題,正因為很多節點之間不存在直接的線索,所以我將此雙向鏈表稱做“特殊的雙向鏈表”,再使用過程中根據指針是線索指針還是子節點指針來分別處理,所以在每個節點需要標明當前的左右指針是線索指針還是子節點指針

  

二叉查找樹(二叉排序樹)

  (圖a)

二叉查找樹是一種動態查找表(圖a),具有這些性質:                                 
(1)若它的左子樹不為空,則左子樹上的所有節點的值都小於它的根節點的值;
(2)若它的右子樹不為空,則右子樹上所有節點的值都大於它的根節點的值;
(3)其他的左右子樹也分別為二叉查找樹;
(4)二叉查找樹是動態查找表,在查找的過程中可見添加和刪除相應的元素,在這些操作中需要保持二叉查找樹的以上性質。

平衡二叉樹(AVL樹)

(圖b)

  含有相同節點的二叉查找樹可以有不同的形態,而二叉查找樹的平均查找長度與樹的深度有關,所以需要找出一個查找平均長度最小的一棵,那就是平衡二叉樹(圖b),具有以下性質:
(1)要么是棵空樹,要么其根節點左右子樹的深度之差的絕對值不超過1;
(2)其左右子樹也都是平衡二叉樹;
(3)二叉樹節點的平衡因子定義為該節點的左子樹的深度減去右子樹的深度。則平衡二叉樹的所有節點的平衡因子只可能是-1,0,1。

赫夫曼樹

赫夫曼樹簡介
給定n個權值作為n個葉子結點,構造一棵二叉樹,若樹的帶權路徑長度達到最小,則這棵樹被稱為赫夫曼樹或者哈夫曼樹。
定義:
路徑和路徑長度
  在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第L層結點的路徑長度為L-1。
結點的權及帶權路徑長度
  若將樹中結點賦給一個有着某種含義的數值,則這個數值稱為該結點的權值。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權值的乘積。
樹的帶權路徑長度
  樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為WPL。
赫夫曼樹圖解
他們的帶權長度分別為:
WPL1:7*2+5*2+2*2+4*2=36
WPL2:7*3+5*3+2*1+4*2=46
WPL3:7*1+5*2+2*3+4*3=35
第三棵樹的帶權路徑長度最小。
給定n個帶權值的葉子結點,若樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為赫夫曼樹或者哈夫曼樹(Huffman Tree)
 
赫夫曼樹創建圖解
假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,
哈夫曼樹的構造規則為:
1. 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);
2. 在森林中選出根結點的權值最小的兩棵樹進行合並,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;
3. 從森林中刪除選取的兩棵樹,並將新樹加入森林;
4. 重復(02)、(03)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。
以{5,6,7,8,15}為例,來構造一棵哈夫曼樹。
第1步:創建森林,森林包括5棵樹,這5棵樹的權值分別是5,6,7,8,15。
第2步:在森林中,選擇根節點權值最小的兩棵樹(5和6)來進行合並,將它們作為一顆新樹的左右孩子(誰左誰右無關緊要,這里,我們選擇較小的作為左孩子),並且新樹的權值是左右孩子的權值之和。即,新樹的權值是11。 然后,將"樹5"和"樹6"從森林中刪除,並將新的樹(樹11)添加到森林中。
第3步:在森林中,選擇根節點權值最小的兩棵樹(7和8)來進行合並。得到的新樹的權值是15。 然后,將"樹7"和"樹8"從森林中刪除,並將新的樹(樹15)添加到森林中。
第4步:在森林中,選擇根節點權值最小的兩棵樹(11和15)來進行合並。得到的新樹的權值是26。 然后,將"樹11"和"樹15"從森林中刪除,並將新的樹(樹26)添加到森林中。
第5步:在森林中,選擇根節點權值最小的兩棵樹(15和26)來進行合並。得到的新樹的權值是41。 然后,將"樹15"和"樹26"從森林中刪除,並將新的樹(樹41)添加到森林中。
此時,森林中只有一棵樹(樹41)。這棵樹就是我們需要的哈夫曼樹!

紅黑樹

  

(圖c)

  紅黑樹是一種自平衡二叉樹,在平衡二叉樹的基礎上每個節點又增加了一個顏色的屬性,節點的顏色只能是紅色或黑色。具有以下性質:
(1)根節點只能是黑色;
(2)紅黑樹中所有的葉子節點后面再接上左右兩個空節點,這樣可以保持算法的一致性,而且所有的空節點都是黑色;
(3)其他的節點要么是紅色,要么是黑色,紅色節點的父節點和左右孩子節點都是黑色,及黑紅相間;
(4)在任何一棵子樹中,從根節點向下走到空節點的路徑上所經過的黑節點的數目相同,從而保證了是一個平衡二叉樹。

B-樹

(圖d)

  B-樹是一種平衡多路查找樹,它在文件系統中很有用。一棵m階B-樹(圖d為4階B-樹),具有下列性質:
(1)樹中每個節點至多有m棵子樹;
(2)若根節點不是葉子節點,則至少有2棵子樹;
(3)除根節點之外的所有非終端節點至少有棵子樹;
(4)每個節點中的信息結構為(A0,K1,A1,K2......Kn,An),其中n表示關鍵字個數,Ki為關鍵字,Ai為指針;
(5)所有的葉子節點都出現在同一層次上,且不帶任何信息,也是為了保持算法的一致性。

B+樹

(圖e)

  B+數是B-樹的一種變形,它與B-樹的差別在於(圖e為3階B+樹):
(1)有n棵子樹的節點含有n個關鍵字;
(2)所有的葉子節點包含了全部關鍵字的信息,及指向這些關鍵字記錄的指針,且葉子節點本身按關鍵字大小自小到大順序鏈接;
(3)所有非終端節點可以看成是索引部分,節點中僅含有其子樹(根節點)中最大(或最小)關鍵字,所有B+樹更像一個索引順序表;
(4)對B+樹進行查找運算,一是從最小關鍵字起進行順序查找,二是從根節點開始,進行隨機查找。

字典樹(trie樹)

(圖f)

  字典樹是一種以樹形結構保存大量字符串。以便於字符串的統計和查找,經常被搜索引擎系統用於文本詞頻統計。它的優點是:利用字符串的公共前綴來節約存儲空間,最大限度地減少無謂的字符串比較,查詢效率比哈希表高。具有以下特點(圖f):
(1)根節點為空;
(2)除根節點外,每個節點包含一個字符;
(3)從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。
(4)每個字符串在建立字典樹的過程中都要加上一個區分的結束符,避免某個短字符串正好是某個長字符串的前綴而淹沒。

后綴樹

所謂后綴樹,就是包含一則字符串所有后綴的壓縮了的字典樹。先說說后綴的定義。給定一長度為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。

  1. S[1..8], XMADAMYX, 也就是字符串本身,起始位置為1
  2. S[2..8], MADAMYX,起始位置為2
  3. S[3..8], ADAMYX,起始位置為3
  4. S[4..8], DAMYX,起始位置為4
  5. S[5..8], AMYX,起始位置為5
  6. S[6..8], MYX,起始位置為6
  7. S[7..8], YX,起始位置為7
  8. S[8..8], X,起始位置為8
  9. 空字串。記為$。

所有這些后綴字符串組成一棵字典樹。

廣義后綴樹

  廣義后綴樹是好幾個字符串的的所有后綴組成的字典樹,同樣每個字符串的所有后綴都具有一個相同的結束符,不同字符串的結束符不同。

傳統的后綴樹只能處理一個單詞的所有后綴。廣義后綴樹存儲任意多個單詞的所有后綴。例如字符串“abab”和“baba”,首先將它們使用特殊結束符鏈接起來,如表示成“ababbaba#”,然后求連接后的新字符的后綴樹,遍歷所得后綴樹,如遇到特殊字符,如“

”,"#"等則去掉以該節點為跟的子樹,最后所得后綴樹即為原字符串組的廣義后綴樹。其實質是將兩個字符串的所有后綴,即:abab,bab,ab,b,baba#,aba#,ba#,a#,組成字典樹,再進行壓縮處理。廣義后綴樹的一個常應用就是判斷兩個字符串的相識度。

參考文獻:https://www.cnblogs.com/shixiangwan/p/7530015.html

我是小仙,小白一枚,一篇下來我也收益不菲。

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM