PTAタイトルセットのデータ構造とアルゴリズム(中国)7-5

PTAタイトルセットのデータ構造とアルゴリズム(中国)7-5スタックパス

7-5スタックパス(25分)
 

副頂点最初は空のスタックの与えられた数の一連の挿入H[]次いで、任意の所与のインデックスのi印刷から、H[i]ルートノードへのパス。

入力フォーマット:

各試験ライン1は、2つの正の整数含まN及びM(個数≤経路)を、それぞれ、インサート要素の数、及び必要に印刷します。次の行は、区間[-10000、10000]を付与され、最初は空のスタックトップ小さな整数に挿入するN。最後の行は与えMの添字を。

出力フォーマット:

所与の入力の各指標i、の行からの出力H[i]のルートノードへのデータパス。スペースで区切られた数字の間には、行の最後には、余分なスペースを持っていないかもしれません。

サンプル入力:

5 3
46 23 26 24 10
5 4 3

出力例:

24 23 10
46 23 10
26 10

题目分析:考查最小堆(优先队列)的实现 需要注意的是 利用插入操作建立最小(大)堆 和 先把数据读入完全二叉树 再调整的方法 可能建成的堆不同 并且他们的时间复杂度也不同(插入操作所需要的时间复杂度为 o(nlogn) 第二种方法的时间复杂度为 线性时间)
1  の#define _CRT_SECURE_NO_WARNINGS   
 2の#include <stdio.hの>
 3の#include <STDLIB.H>
 4の#include < malloc関数 .H>
 5  
6のtypedef 構造体 HeapStruct * のminheap。
7  構造体HeapStruct
 8  {
 9      int型のサイズ;
10      int型の容量;
11      INT * 要素。
12  }。
13  
14のminheap CreatMinHeap(INTの容量)
 15  {
 16      のminheap H。
17     H =(のminheap)はmallocはsizeof構造体HeapStruct))。
18      H->容量= 容量;
19      H->要素=(INT *)はmalloc(H->容量* はsizeofINT ))。
20      H->サイズ= - 1 21      リターンH。
22  }
 23  
24  ボイド挿入(のminheap H、INT 要素)
 25  {
 26      のint i = ++ H-> サイズ。
27      (; I> 0&&要素<H->要素[(I - 1)/ 2 ]。I =(I - 1)/ 2 28          H->要素[I] = H->要素[(I - 1)/ 2 ]。
29      H->要素[I] = 要素と
30  }
 31  
32  空隙削除(のminheap H)
 33  {
 34      INTのTmp = H->要素[H-> Size-- ]。
35      int型の親。
36      int型の子供。
37      のための(親= 0(親*; 2 + 1)<= H->サイズ、親= 子)
 38      {
 39          子供=親* 2 + 1 40          であれば(!子供= H->サイズ&& H->要素[子供]> H->要素[チャイルド+ 1 ])
 41              子++ 42          であれば(TMP <= H->要素[子供])ブレーク43          
44              H->要素[親] = H-> 要素[子供]。
45      }
 46      H->要素が[親] = tmpが。
47  }
 48  
49  空隙 PrecDown(のminheap H、INT I)
 50  {
 51      INTのTmp = H-> 要素[i]は、
52      int型の  親。
53      int型の子供。
54      のための(親= I;(親* 2 + 1)<H->サイズ、親= 子)
 55      {
 56          子供=親* 2 + 1 57          もし(!託児= H->サイズ&& H->要素[子供]> H->要素[チャイルド+ 1 ])
 58              託児++ ;
59          であれば(TMP <= H->要素[子供])休憩;
60          
61              H->要素[親] = H-> 要素[子供]。
62      }
 63      H->要素が[親] = tmpが。
64  }
 65  
66  空隙BuildHeap(のminheap H)
 67  {
 68の     ためのint型 I =(H->サイズ- 1)/ 2 ; I> = 0 ; i-- 69          PrecDown(H、I)。
70  }
 71  
72  ボイドプリント(のminheap H、int型i)の
 73  {
 74      しばらく(I> 0 75      {
 76          のprintf(" %D "、H-> 要素[I])。
77          、I =(I - 1)/ 2 78      }
 79      のprintf(" %d個"、H->要素[ 0 ])。
80  }
 81  のint main()の
 82  {
 83      整数N、M。
84      のscanf(" %d個の%のD "、&​​N、&M)。
85      のminheap H = CreatMinHeap(N)。
86      のためにint型 I = 0 ; iがNを<; Iは++ 87      {
 88          のint NUM。
89          のscanf(" %dの"、およびNUM)。
90          インサート(H、NUM)。
91      }
 92      のためにINT J = 0 ; J <M、J ++ 93      {
 94          INT I。
95          のscanf(" %dの"、およびI);
96          プリント(H、I- 1 )。
97         printf(" \ nを" );
98      }
 99 }
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/57one/p/11580443.html