1. 程式人生 > >遞迴,回溯,合併,動態規劃演算法筆記

遞迴,回溯,合併,動態規劃演算法筆記

一、樹的基本術語
        
  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的冪次方