带有最小堆的C ++二叉树

时间:2018-05-11 21:20:10

标签: c++ binary heap min

我正在尝试在树中创建一个最小堆,但是我在这里是新手,我已经有两周时间用指针和地址继续前进了,

所以我制作了这样的结构:

struct node{
    int data;
    node* left;
    node* right;
};

然后是这样的插入函数:

void Insert(int dataii){
    node* new_node = new node();
    new_node->data = dataii;
    new_node->left = new_node->right = NULL;
}
好吧,现在是我的问题开始时,如何连接节点使它们成为一棵树。

我正在考虑使用数组来存储数组[0]中的new_nodes数,然后存储数组[1],依此类推将new_node与数据和地址相关联。

但我似乎找不到一个有效的代码来完成这项工作。我的目标是制作一个带有最小堆的二叉树,但我还没能做到这一点。

一旦每个父母将有两个孩子的最大值,并且总是在插入时他们从左到右。

如果有人能给我一个好主意如何前进,谢谢。 蒂亚戈

1 个答案:

答案 0 :(得分:0)

这应该让你去。

#include<iostream>

using namespace std;

class Node{
public:
    int data;
    Node *left, *right;

    Node(int data);
    ~Node();
    int count();
    void insert(Node *n);
    void print(const int indent, const char* note);
};

Node::Node(int data) {
   this->data = data;
   this->left = this->right = NULL;
}

Node::~Node(){
    if (this->left != NULL) delete this->left;
    if (this->right != NULL) delete this->right;
}

int Node::count() {
    int r = 1;
    if (this->left != NULL) r += this->left->count();
    if (this->right != NULL) r += this->right->count();
    return r;
}

void Node::insert(Node* n){
    if (this->left == NULL) this->left = n;
    else if (this->right == NULL) this->right = n;
    else if (this->left->count() > this->right->count()) this->right->insert(n);
    else this->left->insert(n);
}

void Node::print(const int indent=0, const char *note="") {
    for(int i = 0; i < indent; i++) cout << " ";
    cout << this->data << " " << note << endl;
    if (this->left != NULL) this->left->print(indent+1, "(l)");
    if (this->right != NULL) this->right->print(indent+1, "(r)");
}

int main(int argc, char const *argv[]) {
    Node *root = new Node(0);
    for (int i = 1; i <= 10; i++) root->insert(new Node(i));
    root->print();
    delete root;
    return 0;
}

See full project with implemented min/max heaps