1. 程式人生 > 實用技巧 >資料結構-堆(優先佇列)習題

資料結構-堆(優先佇列)習題

判斷題

1.任何最小堆的前序遍歷結果是有序的(從小到大)。

T F

2.任何最小堆中從根結點到任一葉結點路徑上的所有結點是有序的(從小到大)。

T F

3.在有N個元素的最大堆中,隨機訪問任意鍵值的操作可以在O(logN)時間完成。

T F

4.一棵有124個結點的完全二叉樹,其葉結點個數是確定的。

T F

5.完全二叉樹中,若一個結點沒有左孩子,則它必是樹葉。

T F

6.完全二叉樹的儲存結構通常採用順序儲存結構。

T F

選擇題

1.堆的形狀是一棵:

A.二叉搜尋樹
B.滿二叉樹
C.非二叉樹
D.完全二叉樹

2.建立一個初始堆,含有N個記錄,其時間複雜

度是:

A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)

3.哪種樹,樹中任何結點到根結點路徑上的各結點值是有序的?

A.二叉搜尋樹
B.完全二叉樹
C.堆
D.以上都不是

4.將6、4、3、5、8、9順序插入初始為空的最大堆(大根堆)中,那麼插入完成後堆頂的元素為:

A.3
B.5
C.6
D.9

5.下列的序列中,哪一組是堆?

A.37,99,45,33,66,10,22,13
B.99,45,66,13,37,10,22,33
C.99,66,45,33,37,10,22,13
D.99,66,22,33,37,13,45,10

6.已知關鍵字序列(5,8,12,19,28,20,15,22)是最小堆(小根堆),插入關鍵字3,調整後得到的最小堆是:

A.3,5,12,8,28,20,15,22,19
B.3,5,12,19,20,15,22,8,28
C.3,8,12,5,20,15,22,28,19
D.3,12,5,8,28,20,15,22,19

7.將10、12、1、14、6、5、8、15、3、9、7逐個按順序插入到初始為空的最小堆(小根堆)中,然後連續執行兩次刪除最小元素操作(DeleteMin),此後堆頂的元素是什麼?

A.5
B.6
C.7
D.9

堆的刪除要注意需要把堆尾元素替換掉堆的根結點,然後下濾。

8.將 {28, 15, 42, 18, 22, 5, 40} 逐個按順序插入到初始為空的最小堆(小根堆)中。則該樹的前序遍歷結果為:

A.5, 18, 15, 28, 22, 42, 40
B.5, 15, 18, 22, 28, 42, 40
C.5, 18, 28, 22, 15, 42, 40
D.5, 15, 28, 18, 22, 42, 40

9.設最小堆(小根堆)的層序遍歷結果為{1, 3, 2, 5, 4, 7, 6}。用線性時間複雜度的演算法將該堆調整為最大堆(大根堆),則該樹的中序遍歷結果為:

A.3, 5, 4, 2, 6, 1, 7
B.1, 4, 3, 7, 2, 6, 5
C.3, 5, 4, 7, 2, 6, 1
D.4, 1, 3, 7, 6, 2, 5

線性時間複雜度演算法,指的是,從n/2的位置開始,建堆(下濾元素)。

10.在有n(>1)個元素的最大堆(大根堆)中,最小元的陣列下標可以是

A.1
B.⌊n/2⌋−1
C.⌊n/2⌋
D.⌊n/2⌋+2

最小元下標一定大於⌊n/2⌋。

11.在將資料序列( 6, 1, 5, 9, 8, 4, 7 )建成大根堆時,正確的序列變化過程是:

A.6,1,7,9,8,4,5 → 6,9,7,1,8,4,5 → 9,6, 7,1,8,4,5 → 9,8,7,1,6,4,5
B.6,9,5,1,8,4,7 → 6,9,7,1,8,4,5 → 9,6,7,1,8,4, 5 → 9,8,7,1,6,4,5
C.6,9,5,1,8,4,7 → 9,6,5,1,8,4,7 → 9,6,7,1,8,4, 5 → 9,8,7,1,6,4,5
D.6,1,7,9,8,4,5 → 7,1,6,9,8,4,5 → 7,9,6,1,8,4, 5 → 9,7,6,1,8,4,5 → 9,8,6,1,7,4,5

12.在一個有2333個元素的最小堆中,下列哪個下標不可能是最大元的位置?

A.1116
B.1167
C.2047
D.2232 最大元座標一定大於⌊n/2⌋。//答案選最小的就行了

13.在下述結論中,正確的是:

① 只有2個結點的樹的度為1;

② 二叉樹的度為2;

③ 二叉樹的左右子樹可任意交換;錯的

④ 在最大堆(大頂堆)中,從根到任意其它結點的路徑上的鍵值一定是按非遞增有序排列的。

A.①④
B.②
C.①②③
D.②③④

14.以下各組序列不屬於堆的是()。

A.(100,85,98,77,80,60,82,40,20,10,66)
B.(10,20,40,60,66,77,80,82,85,98,100)
C.(100,85,40,77,80,60,66,98,82,10,20)
D.(100,98,85,82,80,77,66,60,40,20,10)

15.堆是滿足一定條件的()。

A.完全二叉樹
B.佇列
C.棧
D.線性表

16.下列四個序列中,屬於堆的是()。

A.(75,65,30,15,25,45,20,10)
B.(75,45,65,30,15,25,20,10)
C.(75,45,65,10,25,30,20,15)
D.(75,65,45,10,30,25,20,15)

17.設最小堆(小根堆)的層序遍歷結果為{5, 18, 15, 28, 22, 42, 40}。用線性時間複雜度的演算法將該堆調整為最大堆(大根堆),則該樹的中序遍歷結果為:

A.18, 28, 22, 15, 40, 5, 42
B.18, 28, 22, 42, 15, 40, 5
C.5, 22, 18, 42, 15, 40, 28
D.22, 5, 18, 42, 40, 15, 28

18.對最小堆(小頂堆){1,3,2,6,7,5,4,15,14,12,9,10,11,13,8} 進行三次刪除最小元的操作後,結果序列為:

A.4,5,6,7,8,9,10,11,12,13,14,15
B.4,6,5,13,7,10,8,15,14,12,9,11
C.4,6,5,12,7,10,8,15,14,9,13,11
D.4,5,6,12,7,10,8,15,14,13,9,11

19.用線性時間複雜度的演算法將給定序列{ 28, 12, 5, 8, 19, 20, 15, 22 }調整為最大堆(大根堆),然後插入30。則結果序列為:

A.{ 5, 8, 28, 12, 19, 20, 15, 22, 30 }
B.{ 30, 28, 20, 22, 12, 5, 15, 8, 19 }
C.{ 30, 28, 22, 20, 19, 15, 12, 8, 5 }
D.{ 30, 28, 20, 22, 19, 5, 15, 8, 12 }

堆的插入演算法:插入到最後面,然後上浮。

程式填空題

1.下列程式碼的功能是從一個大頂堆H的某個指定位置p開始執行下濾。
void PercolateDown( int p, PriorityQueue H )
{
   int  child;
   ElementType  Tmp = H->Elements[p];
   for ( ; p * 2 <= H->Size; p = child ) {
      child = p * 2;
      if ( child!=H->Size && H->Elements[child+1] > H->Elements[child] (6))
         child++;
      if ( H->Elements[child] > Tmp )    
		 H->Elements[p] = H->Elements[child] (6);
      else  break;
   }
   H->Elements[p] = Tmp; 
}

2.本函式的功能是從有N個元素的線性表A中查詢第K小的元素。其中函式BuildMaxHeap(H, K)是將元素H[1] … H[K]調整為一個最大堆。請完成下列填空。

ElementType FindKthSmallest ( int A[], int N, int K )
{   /* it is assumed that K<=N */
    ElementType *H;
    int i, next, child;

    H = (ElementType *)malloc((K+1)*sizeof(ElementType));
    for ( i=1; i<=K; i++ ) H[i] = A[i-1];
    BuildMaxHeap(H, K);

    for ( next=K; next<N; next++ ) {
        H[0] = A[next];
        if ( H[0] < H[1] ) {
            for ( i=1; i*2<=K; i=child ) {
                child = i*2;
                if ( child!=K && H[child+1]>H[child] (4) ) child++;
                if ( H[child]>H[0] (5) )
                    H[i] = H[child];
                else break;
            }
            H[i] = H[0];
        }
    }
    return H[1];
}