<span style="background-color: rgb(250, 250, 250); font-family: 'Droid Sans', Verdana, 'Microsoft YaHei', Tahoma, sans-serif; line-height: 1em;"><span style="font-size:32px;">05-树6. Path in a Heap (25)</span></span>
<span style="background-color: rgb(250, 250, 250); font-family: 'Droid Sans', Verdana, 'Microsoft YaHei', Tahoma, sans-serif; line-height: 1em;"><span style="font-size:32px;">05-树6. Path in a Heap (25)</span></span>
时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, YueInsert a sequence of given numbers into an initially empty min-heap H. Then for any given index i, you are supposed to print the path from H[i] to the root.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N and M (<=1000) which are the size of the input sequence, and the number of indices to be checked, respectively. Given in the next line are the N integers in [-10000, 10000] which are supposed to be inserted into an initially empty min-heap. Finally in the last line, M indices are given.
Output Specification:
For each index i in the input, print in one line the numbers visited along the path from H[i] to the root of the heap. The numbers are separated by a space, and there must be no extra space at the end of the line.
Sample Input:5 3 46 23 26 24 10 5 4 3Sample Output:24 23 10 46 23 10 26 10
思路:完全依葫芦画瓢何头的讲解,非常简单,通过循环比较插入结点和其父结点,遇到哨兵的时候推出循环,找到新结点的插入位置插入就好。
代码:#include<iostream> using namespace std; #define MaxData -10001 #define ElementType int typedef struct HeapStruct *MaxHeap; struct HeapStruct{ ElementType *Elements; int size; int Capacity; }; MaxHeap CreateHeap(int MaxSize); void Insert_Heap(MaxHeap H, int item); void Output(MaxHeap H,int n); int main(int argc, char*[]) { int n, m; cin >> n >> m; MaxHeap H = CreateHeap(n); for (int i =1 ; i <=n; i++) { int data; cin >> data; Insert_Heap(H, data); } for (int i = m; i > 0; i--) { int num; cin >> num; Output(H,num); } system("pause"); return 0; } MaxHeap CreateHeap(int MaxSize) { MaxHeap H =(MaxHeap)malloc(sizeof(struct HeapStruct)); H->Elements =(int *) malloc((MaxSize + 1)*sizeof(ElementType)); H->size = 0; H->Capacity = MaxSize; H->Elements[0] = MaxData;//因为要建最小堆,因此在0地址存最小数作为哨兵 return H; } void Insert_Heap(MaxHeap H, int item) { int i; if (H->size == H->Capacity) { cout << "最大堆以满"<<endl; return; } i = ++H->size; for (; H->Elements[i / 2] > item; i /= 2) { H->Elements[i] = H->Elements[i / 2]; } H->Elements[i] = item; } void Output(MaxHeap H,int n) { for (int i = n; i > 0; i /= 2) { cout << H->Elements[i]; if (i == 1) cout << endl; else cout << " "; } }