5-5 堆中的路径

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数NN和MM(\le 10001000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NN个要被插入一个初始为空的小顶堆的整数。最后一行给出MM个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10

本题不可以先将所有输入存入数组,然后用percdown来从数组中建堆,这会使得输出的顺序不对。
应该采用每读入一个新的数据就往堆中插入的方法。
 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <stdlib.h>
 4 #define TYPE int
 5 #define MINNUM -10001
 6 void PrintPath( TYPE* A, int N, int i );
 7 void Insert( TYPE *A, int N, TYPE X );
 8 
 9 int main( ){
10     int N;//插入元素的个数
11     int M;//需要打印的路径条数
12     int* A;
13     scanf( "%d %d", &N, &M );
14     A = ( TYPE* ) malloc( sizeof( TYPE ) * ( N + 1 ) );
15     A[ 0 ] = MINNUM;
16     if( !A ){
17         exit( EXIT_FAILURE );
18     }
19     for( int i = 1; i <= N; i++ ){
20         TYPE data;
21         scanf( "%d", &data );
22         Insert( A, i, data ); //将data插入
23     }
24     for( int i = 0; i < M; i++ ){
25         int k;
26         scanf( "%d", &k );
27         PrintPath( A, N, k );
28     }
29     free( A );
30     return 0;
31 }
32 
33 /*将X插入到N个元素的A中(加上X 为N个)*/
34 void Insert( TYPE *A, int N, TYPE X ){
35     int i = N;
36     for( i = N; A[ i / 2 ] > X; i /= 2 ){
37         A[ i ] = A [ i / 2 ];
38     }
39     A[ i ] = X;
40 }
41 /*打印从A[i]到顶点A[1]的路径*/
42 void PrintPath( TYPE* A, int N, int i ){
43     while( i > 0 ){
44         if( i > 1 ){
45             printf( "%d ", A[ i ] );
46         }
47         else{
48             printf( "%d\n", A[ i ] );
49         }
50         i /= 2;
51     }
52 }

 

posted @ 2017-06-12 20:20  yclzju  阅读(148)  评论(0编辑  收藏  举报