zoukankan      html  css  js  c++  java
  • pta 编程题12 堆中的路径

    其它pta数据结构编程题请参见:pta

    这道题考察的是最小堆。

    堆是一个完全二叉树,因此可用数组表示,一个下标为 i 的结点的父节点下标为 i / 2,子结点下标为 2i 和 2i + 1。

    插入元素:先把元素放到数组的最后面,然后不断循环和父节点比较,如果小于父节点则交换。

    数组的下标为0存放一个很小的值作为哨兵,当进行插入操作时,如果插入的元素需要放到下标为1的位置时,和下标为0的值比较时会大于这个很小的值,因而会停止。

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 int heap[1001];
     6 int size = 0;
     7 void insert(int x);
     8 void printTrace(int i);
     9 
    10 int main()
    11 {
    12     int n, m, i, t;
    13     cin >> n >> m;
    14     heap[0] = -10001;//哨兵
    15     for (i = 0; i < n; i++)
    16     {
    17         cin >> t;
    18         insert(t);
    19     }
    20     for (i = 0; i < m; i++)
    21     {
    22         cin >> t;
    23         printTrace(t);
    24     }
    25     return 0;
    26 }
    27 
    28 void insert(int x)
    29 {
    30     int i;
    31     for (i = ++size; heap[i / 2] > x; i /= 2)
    32         heap[i] = heap[i / 2];
    33     heap[i] = x;
    34 }
    35 
    36 void printTrace(int i)
    37 {
    38     vector<int> v;
    39     while (i)
    40     {
    41         v.push_back(heap[i]);
    42         i /= 2;
    43     }
    44     for (int j = 0; j < v.size(); j++)
    45     {
    46         if (j) cout << " ";
    47         cout << v[j];
    48     }
    49     cout << endl;
    50 }
  • 相关阅读:
    freemarker时间转换197
    用FileZilla服务器端和客户端实现本机与虚拟机之间文件上传和下载197
    springboot pom 详解197
    eclipse svn197
    eclipse 安装git197
    listen()函数中backlog参数分析
    linux 函数库使用
    gdb调试问题汇总
    gdb调试多线程
    linux-C 多线程编程
  • 原文地址:https://www.cnblogs.com/lxc1910/p/8811168.html
Copyright © 2011-2022 走看看