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->容量* はsizeof(INT ))。 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 }