作者:whj95
導讀
樹
樹的定義
沒有簡單迴路 連通 無向圖(回憶簡單圖:沒有重複邊)
簡單理解,無環 無多重邊 連通
樹的高度:以根節點爲0層,到樹葉的最長路徑爲樹的高度
平衡(balanced):所有樹葉都在h或h-1層
樹的種類
m元樹: 每個內點不超過m個子女
正則m元樹: 每個內點恰好等於m個子女
二叉樹: 正則2元樹
樹的性質
①n個頂點n-1個邊
②有着i個內點的正則m元樹有n= mi + 1頂點(所有子正則m元樹+根)
③根據2和n= l+i(n爲頂點數,l爲葉子數,i爲內點數)
④高度爲h的m元樹中至多有m
樹的運用
哈夫曼編碼
①選出當前最小的兩個權值構成較小的樹,樹葉左大右小放置,根節點記下權值和,樹枝左0右1
②把生成的樹新的權值插入隊伍,重複①
③編碼即爲從根節點到路徑的01編碼,平均位數就爲
例子如下:
樹的遍歷 TreeTraversal
遍歷
下面的前中後序的前中後都是描述對根的優先級,每移動一步都要重置指令:
首先貼個萬能的例題,然後在不同的排序方法中展示它的不同:
前序遍歷(Preorder):優先級即根左右,例題的排序就爲:a,b,e,j,k,n,o,p,f,c,d,g,l,m,h,i
中序遍歷(Inorder):優先級即左根右,例題的排序就爲:j,e,n,k,o,p,b,f,a,c,l,g,m,d,h,i
後序遍歷(Postorder):優先級即左右根,例題的排序就爲:j,n,o,p,k,e,f,b,c,l,m,g,h,i,d,a
記法及讀法
前綴記法(Prefix Notation):
記法:
讀法:從後向前讀
後綴記法(Postfix Notation):
記法:
讀法:從前往後
中綴記法(Infix Notation):
給出一箇中綴表達式:
a+b*c-(d+e)
第一步:
按照運算符的優先級對所有的運算單位加括號,式子變成:
((a+(b*c))-(d+e))
第二步:
轉換前綴:把運算符號移動到對應的括號前面則變成拉:-( +(a *(bc)) +(de))把括號去掉:
-+a*bc+de
轉換後綴:把運算符號移動到對應的括號後面則變成拉:((a(bc)* )- (de)+ )+把括號去掉:
abc*-de++
生成樹 Spanning Trees
定義:包含原圖中所有頂點的樹(無環 無多重邊 連通)
廣度優先搜索(Breadth First Search):即橫向遍歷,以行爲單位一層一層地深究到最右方,然後跳至下一行最左端。
簡言之,目光短淺一手抓
深度優先搜索(Depth First Search):即縱向遍歷,以“列”爲單位從左向右一豎一豎地深究到最底端,到達最底端後返回根節點,遍歷新一豎的列。
簡言之,一條路走到黑
舉個萬能的例子:
以f爲起點,BFS第一步是d,e,g,h
以f爲起點,DFS第一步是h,k,j(其中一種)
最小生成樹 Minimum Spanning Trees
普林算法( Prim’s Algorithm)
①選擇權值最小的一條邊記下兩端端點加入隊列
②找出與隊列中任一端點有關的所有邊,選擇權值最小的,記下其端點
③重複②並且不形成迴路,直到遍歷了所有頂點(出現生成樹)
給個例子:
克魯斯卡爾算法( Kruskal’s Algorithm)
與Prim Algorithm唯一區別是不定死要求要找與點聯繫的邊,把邊以權值從小到大排序,從上到下挑選直至挑選完所有頂點且之前不形成迴路