C++实现二叉树TreeHeap

60 阅读1分钟

TreeHeap是一种堆的实现,通常使用树的结构来表示。在C++中,可以通过二叉树或者多叉树来实现TreeHeap。下面是一个简单的示例,演示了如何使用二叉树来实现TreeHeap:

#include <iostream>
#include <vector>

class TreeHeap {
private:
    std::vector<int> heap;

    // 辅助函数:上浮操作
    void heapifyUp(int index) {
        if (index <= 0) return;
        int parent = (index - 1) / 2;
        if (heap[index] < heap[parent]) {
            std::swap(heap[index], heap[parent]);
            heapifyUp(parent);
        }
    }

    // 辅助函数:下沉操作
    void heapifyDown(int index) {
        int left = 2 * index + 1;
        int right = 2 * index + 2;
        int smallest = index;
        if (left < heap.size() && heap[left] < heap[smallest]) {
            smallest = left;
        }
        if (right < heap.size() && heap[right] < heap[smallest]) {
            smallest = right;
        }
        if (smallest != index) {
            std::swap(heap[index], heap[smallest]);
            heapifyDown(smallest);
        }
    }

public:
    // 插入元素
    void insert(int value) {
        heap.push_back(value);
        heapifyUp(heap.size() - 1);
    }

    // 删除堆顶元素
    void removeTop() {
        if (heap.empty()) return;
        heap[0] = heap.back();
        heap.pop_back();
        heapifyDown(0);
    }

    // 获取堆顶元素
    int top() {
        if (heap.empty()) throw std::out_of_range("Heap is empty");
        return heap[0];
    }

    // 判断堆是否为空
    bool empty() {
        return heap.empty();
    }
};

int main() {
    TreeHeap heap;
    heap.insert(3);
    heap.insert(5);
    heap.insert(1);
    heap.insert(4);
    heap.insert(2);

    while (!heap.empty()) {
        std::cout << heap.top() << " ";
        heap.removeTop();
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们定义了一个TreeHeap类来实现TreeHeap的功能。它使用一个vector来存储堆中的元素,并通过两个辅助函数heapifyUpheapifyDown来维护堆的性质。insert函数用于插入元素,removeTop函数用于删除堆顶元素,top函数用于获取堆顶元素,empty函数用于判断堆是否为空。

这只是一个简单的示例,实际上TreeHeap的实现可能会更复杂,特别是在处理多叉树的情况下。