遞迴,回溯,合併,動態規劃演算法筆記 阿新 • • 發佈:2018-12-29 一、樹的基本術語 1.樹的度——也即是寬度,以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3; 2.樹的深度——以組成該樹各結點的最大層次,如上圖,其深度為4; 3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林; 4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。 二、樹的表示 樹的表示方法有許多,常用的方法是用括號:先將根結點放入一對圓括號中,然後把它的子樹由左至右的順序放入括號中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括號括起來,同層子樹之間用逗號隔開,最後用閉括號括起來。如上圖可寫成如下形式: (A(B(E(K,L),F),C(G),D(H(M),I,J))) 三、二叉樹 1.二叉樹的基本形態: 二叉樹也是遞迴定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態: (1)空二叉樹——(a); (2)只有一個根結點的二叉樹——(b); (3)右子樹為空的二叉樹——(c); (4)左子樹為空的二叉樹——(d); (5)完全二叉樹——(e) 2.兩個重要的概念: (1)完全二叉樹——只有最下面的兩層結點度小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹; (2)滿二叉樹——除了葉結點外,每一個結點都有左右子女的二叉樹。 如下圖: 3.二叉樹的性質 (1)在二叉樹中,第i層的結點總數不超過2^(i-1); (2)對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1; (3)有N個結點的完全二叉樹各結點如果用順序方式表示,則結點之間有如下關係: ·如果I<>1,則其父結點的編號為I/2; ·如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子; ·如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。 4.二叉樹的儲存結構: (1)順序儲存方式 (2)連結串列儲存方式,如: 陣列下標: 1 2 3 4 5 6 7 8 陣列D: A B C D E F G H 左指標陣列L: 2 4 6 0 7 0 0 0 右指標陣列R: 3 5 0 0 0 8 0 0 5.普通樹轉換成二叉樹:凡是兄弟就用線連起來,然後去掉父親到兒子的連線,只留下父母到其第一個子女的連線。 6.二叉樹的遍歷運算(遞迴定義) (1)先序遍歷 訪問根;按先序遍歷左子樹;按先序遍歷右子樹 (2)中序遍歷 按中序遍歷左子樹;訪問根;按中序遍歷右子樹 (3)後序遍歷 按後序遍歷左子樹;按後序遍歷右子樹;訪問根 四、例: 1.用順序儲存方式建立一棵有31個結點的滿二叉樹,並對其進行先序遍歷。( tree1.pas) 2.用連結串列儲存方式建立一棵如圖三、4所示的二叉樹,並對其進行先序遍歷。(tree2.pas) 3.給出一組資料:R={10.18,3,8,12,2,7,3},試程式設計序,先構造一棵二叉樹,然後以中序遍歷訪問所得到的二叉樹,並輸出遍歷結果。(tree3.pas) 4.給出八枚金幣a,b,c,d,e,f,g,h,程式設計以稱最少的次數,判定它們蹭是否有假幣,如果有,請找出這枚假幣,並判定這枚假幣是重了還是輕了。 分支限界 相關知識: 深度優先 | 廣度優先:三角形 |剪枝搜尋| 遞迴與回溯 | 素數環 | 八皇后問題 | 跳馬問題 | 例項: 2的冪次方