數據結構與算法分析之樹的概念總結


1.二叉查找樹的大部分操作運行時間平均爲O(logN)


2.樹是N個節點和N-1條邊的集合,其中一個節點叫做根。存在N -1條邊的結論由下面的事實得出:
每條邊都將某個節點連接到它的父親,除根節點以外每個節點都有一個父親


3.沒有兒子的節點稱爲樹葉


4.路徑定義:從節點n1到nk的路徑定義爲節點n1,n2,...nk的一個序列,使得對於1<= i <k,節點
ni是n(i+1)的父親。

5.路徑的長定義爲該路徑上邊的條數。


6.一顆樹中從根到每個節點恰好存在一條路徑


7.對任意節點ni, ni的深度爲從根到ni的唯一路徑長度(深度定義方向是從根到節點,起點是根終點是ni)


8.ni的高是從ni到一片樹葉的最長路徑的長,因此所有樹葉的高度都是0(高度方向是從節點到樹葉,起點是ni,終點是樹葉)


9.一顆樹的深度等於它的最深的樹葉的深度,該深度總是等於這棵樹的高。樹的高度和深度定義實際是從根節點算起。


10.樹的應用:
a.操作系統中目錄結構的應用

11.先序遍歷(preorder traversal):在先序遍歷中,對節點的處理工作是在它的諸兒子節點被處理之前進行。
即先處理父親節點後處理兒子節點。

12.後序遍歷(postorder traversal):每個節點的處理工作是在它的諸兒子節點處理後進行的。(先處理兒子節點再處理父親節點)


13.二叉樹:樹上每個節點都不能有多於兩個的兒子。


14.二叉樹的平均深度爲O(sqrt(N)),對於特殊類型的二叉查找樹,其平均深度爲O(logN)。


15.二叉樹的主要用處之一是在編譯器設計領域用於描述表達式。


16.表達式樹:樹葉是操作數,其他節點是操作符。表達式樹不一定是2叉樹,有三元運算符的時候兒子節點會有3個。
a.中序遍歷產生的表達式是中綴表達式,後序遍歷產生的表達式是後綴表達式,先序遍歷產生的表達式是前綴表達式

17.通過中綴或者後綴表達式構造表達式樹的方法:
關鍵點:a.如果是中綴則根據第3章的方式修改爲後綴表達式
b.遇到操作數入棧,遇到操作符時,從棧中彈出兩個指針(可能是操作數或操作符)作爲操作符的兩個兒子節點,然後將操作符指針入棧

18.二叉查找樹:對於樹中每個節點X,它的左子樹中所有關鍵字的值小於X的關鍵字值,它的右子樹中所有關鍵字值大於X的關鍵字值。


19.對於二叉查找樹的插入操作,最終的插入點一定是空的節點上,不會存在插入點上已有節點的情況。也就是插入點是新建的節點。


20.假設所有的樹出現的機會均等,則樹的所有節點的平均深度爲O(log N)


21.一顆樹的所有節點的深度的和稱爲內部路徑長(internal path length)


22.AVL(Adelson-Velskii和Landis)樹是帶有平衡條件的二叉查找樹。其每個節點的左子樹和右子樹的高度最多查1的二叉查找樹。


23.對於AVL樹的插入操作,破壞的是從插入點到根節點的路徑上的節點的平衡。因爲只有這些節點的子樹可能發生變化。
所以插入操作時,需要沿着插入點到根節點去更新每個節點的新高度,當發現節點左右子樹的高度差大於等於2時,說明
找到了一個不平衡的節點,需要通過旋轉去恢復樹的平衡性。第一個不平衡的節點也是所有不平衡的節點中最深的那個。


24.假設節點a處的高度不平衡,容易看出造成這種不平衡的情況有四種:
1.對a的左兒子的左子樹進行一次插入(左-左)
2.對a的左兒子的右子樹進行一次插入(左-右)
3.對a的右兒子的左子樹進行一次插入(右-左)
4.對a的右兒子的右子樹進行一次插入(右-右)
其中情形1和4是關於a點的鏡像對稱,2和3是關於a點的鏡像對稱。所以理論上屬於兩種情況,第一種情況是插入發生在"外邊"的情況(即左-左或右-右)
該情況可以通過對樹的單旋轉來調整。第二種情況是插入發生在內部的情形(即左右和右左的情況),此種情況需要通過複雜一些的雙旋轉來調整。
雙旋轉又可以通過兩次單旋轉來完成。

25.樹的遍歷
先序遍歷:先處理父節點再處理兒子節點
中序遍歷:先處理左兒子節點再處理父親節點最後處理右兒子節點
後序遍歷:先處理兒子節點在處理父親節點
層序遍歷:所有深度爲D的節點要在深度爲D+1的節點之前處理。需要用隊列實現。

26.B樹
多叉的查找樹,階爲M的B樹需滿足下列約束:
a.樹的根或者是一片樹葉,或者其兒子數在2和M之間
b.除了根外,所有的非樹葉節點的兒子數在[M/2]和M之間
c.所有的樹葉都在相同的深度上

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