Программа заканчивает работу с кодом ошибки 3221225477

Пытаюсь реализовать почти полное строго бинарное дерево; на вход даётся N - количество уровней, K - количество элементов на последнем уровне. Для поочерёдного добавления элементов в левое и правое поддерево используется очередь из указателей на указатели на узлы tnode **.
Программа, в теории, работает, но выдаёт ошибку 3221225477. Неоднократно с ней сталкивался, но каждый раз не могу найти причину, вызывающую эту ошибку. Прошу прощения за большое количество кода.
Реализация очереди:

#include <stdlib.h>
#include <stdio.h>

typedef struct btree_node
{
    unsigned int data;
    struct btree_node * left, * right;
}   tnode;

typedef struct queue_node
{
    tnode ** pointer;
    queue_node * next;
}   qnode;

typedef class queue
{
    private:
        qnode * begin, * end;
    public:
        queue ();
        ~queue ();
        void push (tnode ** new_tnode);
        tnode ** pop ();
}   QUEUE;

queue :: queue ()
{
    begin = end = NULL;
}

queue :: ~queue ()
{
    qnode * temp = begin;
    while (temp)
    {
        temp = begin;
        begin = begin->next;
        free (temp);
    }
}

void queue :: push (tnode ** new_tnode)
{
    qnode * element = (qnode *) malloc (sizeof (qnode));
    element->pointer = new_tnode;

    if (begin == NULL)
    {
        begin = end = element;
        return;
    }

    end->next = element;
    end = element;
}

tnode ** queue :: pop ()
{
    if (begin == NULL) return NULL;

    tnode ** ret_node = begin->pointer;                       //Дебаг ругается здесь

    qnode * del_node = begin;
    begin = begin->next;
    if (begin == NULL) end = NULL;
    free (del_node);
    return ret_node;
}

Реализация дерева:

#include "queue_class_2.cpp"
#include <iostream>

typedef class binary_tree
{
    private:
        tnode * root;
        QUEUE pointers;
    public:
        binary_tree ();
        bool empty ();
        void add_node (unsigned int data);
        void print ();
}   TREE;

binary_tree :: binary_tree ()
{
    root = NULL;
    tnode ** temp = &root;
    pointers.push (temp);
}

bool binary_tree :: empty ()
{
    return root == NULL;
}

void binary_tree :: print ()
{
    printf ("PRINT\n");
    printf ("%u %u %u\n", root->data, root->left->data, root->right->data);
    printf ("PRINT\n");
}

void binary_tree :: add_node (unsigned int data)
{
    tnode * new_node = (tnode *) malloc (sizeof (tnode));
    new_node->data = data;
    new_node->left = new_node->right = NULL;
    tnode ** cur = pointers.pop ();
    *cur = new_node;

    tnode ** temp = &(new_node->left);
    pointers.push (temp);
    temp = &(new_node->right);
    pointers.push (temp);
}

Основная программа (N и K считываются верно, код сократил):

void build_tree (TREE &new_tree, unsigned int N, unsigned int K)
{
    if (!new_tree.empty()) return;
    unsigned int n, k, max_k, count;

    for (n = 0; n < N; n++)
    {
        max_k = 1; count = n;
        while (count)
        {
            max_k *= 2;
            count -= 1;
        }
        for (k = 1; k <= max_k; k++)
            new_tree.add_node (n);
    }
    for (k = 1; k <= K; k++)
        new_tree.add_node (n);
}

int main ()
{
    unsigned int N, K;
    TREE tree;

    N = read_N ();
    K = read_K (N);
    build_tree (tree, N, K);
    tree.print ();
    return 0;
}

Ответы (0 шт):