C++中用多叉树实现TreeHeap

76 阅读1分钟

下面是一个使用多叉树实现TreeHeap的简单示例:

#include <iostream>
#include <vector>
#include <queue>

class TreeNode {
public:
    int val;
    std::vector<TreeNode*> children;

    TreeNode(int value) : val(value) {}
};

class TreeHeap {
private:
    TreeNode* root;

    // 辅助函数:上浮操作
    void heapifyUp(TreeNode* node) {
        if (!node->parent) return; // 已经是根节点
        if (node->val < node->parent->val) {
            std::swap(node->val, node->parent->val);
            heapifyUp(node->parent);
        }
    }

    // 辅助函数:下沉操作
    void heapifyDown(TreeNode* node) {
        if (!node) return;
        for (TreeNode* child : node->children) {
            if (child->val < node->val) {
                std::swap(child->val, node->val);
                heapifyDown(child);
            }
        }
    }

public:
    TreeHeap() : root(nullptr) {}

    // 插入元素
    void insert(int value) {
        TreeNode* newNode = new TreeNode(value);
        if (!root) {
            root = newNode;
            return;
        }
        std::queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* curr = q.front();
            q.pop();
            if (curr->children.size() < 2) {
                curr->children.push_back(newNode);
                newNode->parent = curr;
                heapifyUp(newNode);
                return;
            }
            for (TreeNode* child : curr->children) {
                q.push(child);
            }
        }
    }

    // 删除堆顶元素
    void removeTop() {
        if (!root) return;
        int minValue = root->val;
        TreeNode* minNode = root;
        std::queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* curr = q.front();
            q.pop();
            if (curr->val < minValue) {
                minValue = curr->val;
                minNode = curr;
            }
            for (TreeNode* child : curr->children) {
                q.push(child);
            }
        }
        std::swap(minNode->val, root->val);
        heapifyDown(root);
    }

    // 获取堆顶元素
    int top() {
        if (!root) throw std::out_of_range("Heap is empty");
        return root->val;
    }

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

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;
}

在上面的示例中,我们定义了一个TreeNode类来表示多叉树的节点。每个节点包含一个值和一个指向其父节点的指针,以及一个指向其子节点的动态数组。TreeHeap类中的insertremoveToptopempty函数与之前的示例相同,只是根据多叉树的特性进行了相应的修改。