1. 程式人生 > >【自考】 資料結構考前總結【CH4-CH6】

【自考】 資料結構考前總結【CH4-CH6】

CH4 樹和二叉樹

  1. 基本概念

      結點的度 :樹上任一結點所擁有的子樹的數目稱為該樹的度。

      葉子:度為0的結點稱為葉子或終端結點。

      結點的層次:從根開始算起,根的層次為1,其餘結點的層次為其雙親的層次加1. 

      樹的高度 : 一棵樹中所有結點層次數的最大值稱為該樹的高度或深度。

      有序樹: 若樹中各結點的子樹從左到右是有次序的,不能互換,稱為有序樹。

      遍歷(TraverseTree(T))

 

 2. 二叉樹中  no = n2 + 1 (兩層的滿二叉樹)

     S = n0 + n1 + n2 + n3 + ... + nk;              [結點總數]

     S-1 = 0*n0 + 1*n1+ 2*n2 +.... + k*nk;       [枝杈數目,枝杈通過孩子雙親關係產生]

 

3.  含有n個結點的完全二叉樹的深度為[log2(n)] +1  (此處為下取整,將2代入可證)

4. 完全二叉樹,沒有虛擬結點,從順序儲存中可以看出(順序表下標從 1 開始儲存,表頭下標為 0)。

5. 樹的遍歷(圖是遍歷深度和廣度優先搜尋)

     先序遍歷 preorder(BinTree BT) ; 中序遍歷 inorder(BinTree BT) ; 後序遍歷 postorder(BinTree BT)

 

void preorder(BinTree BT)
{
    if (bt != NULL)
    {
        visit(bt);
        preorder(bt -> lchild);
        preorder(bt -> rchild);    
    }
}
// 非遞迴遍歷實現
void PreOrder(BinTree BT)
{
    BinTree p;
    LKStk  *LS;
    if ( t == NULL ) return;
    InitStack( LS );
    p = t;
    
    while( p != NULL || EmptyStack(LS))  //迴圈條件是當前指標或棧至少有一個不為空
    {
      if (p != NULL)
         {
            Visit(p->data);              // 訪問結點的資料
            Push(LS,p);                  // 將當前指標壓入棧中         
            p = p ->lchild;              // 將指標指向p的左孩子
         }
      else 
         {
            p = Gettop(LS);              // 取棧頂元素
            Pop(LS);                     // 出棧
            p = p -> rchild;             // 指標指向它的右孩子
         }
    } // end of while 
} 
void levelorder(BinTree bt)
{
    LkQue Q;
    InitQueue(&Q);
    if (bt != NULL)
       {   EnQueue(&Q,bt);
       while(!EmptyQueue(Q))
         {  p = GetHead(&Q);
            outQueue(&Q);
            visit(p);
            if (p -> lchild != NULL)  EnQueue(&Q, p -> lchild);
            if (p -> rchild != NULL)  EnQUeue(&Q, p -> rchild);
             
         }//  end of while
       }// end of if
}

6. 樹的應用判定樹 --- 哈夫曼樹

生成步驟

1)按照概率或者鍵值從小到大有序排列

2)按照原鍵值優先的原則,從序列中取出最小的和次小的進行兩兩結合。

3)最終生成的判定樹滿足  左孩子比右孩子小的特點。

哈夫曼編碼 左0右1.

 

CH5  圖

1. 基本概念  P130

    圖結構中結點之間的鄰接關係可以是任意的。

    G= (V,E)

    邊集和點集都是G的子集的G'是G的子圖。

    生成樹:一個連通圖的生成樹,是含有該連通圖的全部頂點的一個極小連通子圖。(少一個邊或者弧,圖就不連通了。)

    強連通分量:有向圖的極大強連通子圖稱為強連通分量。(連通情況最好的)(McCabe複雜度模型 m-n+2p)

    如果G的一個子圖G’的邊數大於n-1,則G’中一定有環。

    圖的儲存形式有 鄰接矩陣、鄰接表、十字連結串列和鄰接多重表。

    路徑,路徑長度

    迴路: 第一個頂點和最後一個頂點相同的路徑稱為迴路或環。

    簡單迴路:除了第一個頂點和最後一個頂點外,其餘頂點不重複的迴路。

// 鄰接矩陣的建立
void CreateGraph(Graph *g)
{
   int i,j,n,e,w;
   char ch;
   scanf("%d %d", &n, &e);
   g -> vexnum = n ;
   g -> arcnum = e ;
   for (i = 0 ;i < g -> vexnum; i++)
   {   scanf("%c",&ch);
       g -> vexs[i] = ch;
   }
   for (i = 0 ;i < g -> vexnum; i++)
     for (j = 0 ;j < g -> vexnum; j++)
          g -> arcs[i][j] = MAX_INT;
   for (k = 0 ;k < g -> arcnum; k++)
   {
     scanf("%d %d %d" ,&i ,&j ,&w );
     g -> arcs[i][j] = w;
     g -> arcs[j][i] = w;
   }
}

2.   鄰接表 

  表頭結點 (vertex,firstarc) ;  表結點(adjvex,nextarc); 帶權圖表結點(adjvex, weight, nextarc)

  通過鄰接表獲得圖的出度和入度。

  出度,表頭結點後面的表結點的數目;入度:結點標籤在表結點中出現的次數。

  逆鄰接表

3.   鄰接矩陣

  有邊或弧相連,arcs[ i ][ j ] = [ 1 | weight ];

  無邊或弧相連,arcs[ i ][  j ] = [ MAX_INT | ∞]

4.  圖的遍歷

  深度優先搜尋和廣度優先搜尋都 適用於有向圖和無向圖。

5. 最小生成樹

   Prim ( 貪吃蛇,吞併結點,尋找鄰近的權重最小的邊)

   Kruskal (撿柴火,找權重最小的邊,以不形成環為原則)

6. 單源最短路徑

   動態規劃法,從一個頂點出發,通過不斷計算各個頂點到源頂點的距離,吞併權重之和最小的頂點入點集,直至點集為全集.

  圖P150,出過課後題

7. 拓撲序列  

   入度為0的頂點先寫,   表示式  vi1, vi2,vi3, ... ...

  時間複雜度為 O(n+e)

 

CH 6 查詢

1. 基本概念

   查詢表示由同一型別的資料元素構成的集合

   靜態查詢表   順序表(ASL=(n+1)/2),有序表(二分查詢(ASL=log2(n+1)-1),索引查詢(ASL = (1/2)*(n/s + s)-1 兩次順序查詢)

   動態查詢表   二叉排序樹 (左小右大,根的比較次數為1;O(n) 和O(log2(n)));散列表(除留餘數法生成雜湊地址;解決衝突:線性探測,二次探測,鏈地址法(解決“堆積”))

2. 散列表的基本概念

   資料元素的鍵值和儲存位置之間建立的對應關係H稱為雜湊函式。

   用鍵值通過雜湊函式獲取儲存位置的這種儲存方式構造的儲存結構稱為散列表,這一對映過程稱為雜湊。

   解決的問題:1. 構造均勻的雜湊函式(數字分析法,除留餘數法,平方取中法,基數轉換法 ); 2. 如何解決衝突(線性探測,二次探測法,鏈地址法,多重雜湊法,公共溢位區法)。