c++ - 最小二进制堆问题

标签 c++ algorithm heap binary-heap

我需要有关此 minheap 代码的帮助:

#include < vector>

using namespace std;

class heap {

    vector <int> v;

    public:

        int hSize()
        {
            return v.size();
        }

        int rsize()
        {
            return  hSize() - 1;
        }    

        int parent(int i) 
        {
            return (i - 1) / 2;
        }

        int left(int i)
        {
            return i * 2 + 1;
        }

        int right(int i)
        {
            return i * 2 + 2;
        }

        void swap(int i, int j)
        {
            int temp = v[j];
            v[j] = v[i];
            v[i] = temp;
        }

        void push(int e)
        {

            v.push_back(e);
            int id = rsize(); 

            if (hSize() > 1)
                while (v[parent(id)] > v[id]) {               
                    swap(parent(id), id);
                    id = parent(id);
                }
        }

        int pop ()
        {

          int f = 0;  
          int p = v[0];

          v[0] = v[rsize()];

          if (hSize() > 1) {
              while (v[left(f)] < v[f] || v[right(f)] < v[f]) {
                    if (v[left(f)] < v[f] && v[right(f)] < v[f]) {
                        if (v[left(f)] < v[right(f)]) {
                            swap(left(f), f);
                            f = left(f);
                    }
                    else { 
                            swap(right(f), f);
                            f = right(f);
                    }
                }

                else {
                    if (v[left(f)] < v[f]){
                         swap(left(f), f);
                         f = left(f);
                    }
                    else {
                         swap(right(f), f);
                         f = right(f);
                        }
                    }
                } 
          }
          else { }

          v.resize(rsize());
          return p;
        }

        void show()
        {
            if (hSize() > 0) {
                cout << "Heap content: ";
                for (int i = 0; i < hSize(); i++) cout << v[i] << " ";
            }
            else cout << "\nHeap successfully emptied!";  
            cout << "\n";          
        }

        bool Empty()
        {
            return v.empty();
        }

        ~heap()
        {
            v.clear();
        }

    };         

好吧,除了当它弹出屏幕上的最后一个元素时它打印一个随机数之外,代码几乎做对了所有事情。你怎么看?

谢谢!

最佳答案

您有两个类似的问题,一个在 push() 中,一个在 pop() 中。在推送中,您需要在查看 v[parent(id)] 之前检查 id != 0。如果 id == 0 你在根目录,你应该停止。同样,在 pop() 中,您应该在访问 之前检查 right(f)(或 left(f))是否在 vector 内>v[right(f)](或 v[left(f)])。如果不是,则您已到达堆的底部,您应该停止。

关于c++ - 最小二进制堆问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332841/

相关文章:

c++ - 在另一个类中使用类函数

c++ - 是否可以从 ELF Core 文件中删除堆?

java - 针对给定场景的速率限制算法建议

c++ - 判断两棵树是否同构

python - 每个深度的二叉树遍历总和

python - Heapq模块实现

go - 空堆上的容器/堆 Pop()

C++/SFML 定位 Sprite 问题

c++ - 在读取文件 C++ 时使用 getline 和 >>

java - 为我的 PriorityQueue 实现自定义比较器