码迷,mamicode.com
首页 > 其他好文 > 详细

建堆[HihoCoder-1405]

时间:2017-04-13 22:27:08      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:size   div   数组   bsp   最小堆   template   family   子序列   heap   

Building Heap HihoCoder-1405

hihoCoder太阁最新面经算法竞赛11

问题大意:给定一个$N$个元素的数组$A$(元素互不相同),要求你建立满足下列要求的二叉树$T$,并输出其前序遍历:

1)$T$满足最小堆性质;

2)输入的数组$A$满足$T$的中序遍历。

这是一道数据结构基础题,主要是解决如何建堆。题目要求最小堆,其树根必然是整个树的最小值。因此在建堆过程中,只需寻找最小值,根据找到的最小值的位置将中序遍历的序列一分为二,继续对这两个子序列建堆,直到子序列没有元素为止。利用递归很容易写出程序。这道题要求输出前序遍历结果,因此可以不用实际建堆而直接在建堆的同时输出即可。时间复杂度为$O(n\rm{log}n)$。

 

 1 #include<iostream>
 2 using namespace std;
 3 template<typename T>
 4 int findmin(T A[], int size)
 5 {
 6     int min = 0;
 7     for (int i = 1; i < size; i++)
 8         if (A[i] < A[min])
 9             min = i;
10     return min;
11 }
12 void bheap(int A[], int size)
13 {
14     int minpos = findmin(A, size);
15     cout << A[minpos] << " ";
16     if (minpos!=0)
17         bheap(A, minpos);
18     if (minpos != size - 1)
19         bheap(A + minpos + 1, size - minpos - 1);;
20 }
21 int main()
22 {
23 #define TMAX 150
24     int A[TMAX];
25     int n;
26     cin >> n;
27     for (int i = 0; i < n; i++)
28         std::cin >> A[i];
29     bheap(A, n);
30     return 0;
31 }

 

建堆[HihoCoder-1405]

标签:size   div   数组   bsp   最小堆   template   family   子序列   heap   

原文地址:http://www.cnblogs.com/ggggg63/p/6706448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!