АВЛ-деревья C++. Циклично добавлять элементы в дерево, пока высота всех листов дерева не будет одинакова

Недавно начал изучать структуры и алгоритмы обработки данных, и в качестве задания нужно написать свое дерево и обойти его в ширину, найти максимальную глубину листа и циклично добавлять элементы в дерево, пока высота всех листов дерева не будет одинакова, но не превысит изначально найденного максимального значения. Справился со всем, кроме последнего пункта задания

#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;

struct TreeNode
{
    int data;
    int depth;
    TreeNode* left,
        * right;
};

struct QueueNode
{
    TreeNode* trans;
    QueueNode* next;
};

class Queue
{
private:
    QueueNode* Head;

public:
    Queue()
    {
        Head = NULL;
    }

    int isEmpty()
    {
        if (Head == NULL)
            return 1;
        else
            return 0;
    }

    void addToQueue(TreeNode* tmp)
    {
        QueueNode* Ptr = new QueueNode;
        Ptr->trans = tmp;

        if (Head == NULL)
        {
            Head = Ptr;
            Ptr->next = NULL;
        }
        else
        {
            QueueNode* tmp_c = Head;

            while (tmp_c->next != NULL)
                tmp_c = tmp_c->next;

            tmp_c->next = Ptr;
            Ptr->next = NULL;
        }
    }

    TreeNode* delQueue()
    {
        QueueNode* cur = Head->next;
        TreeNode* tmp_c = Head->trans;

        if (Head != NULL)
        {
            delete Head;
            Head = cur;
            return tmp_c;
        }
        else
            return NULL;
    }
};

class Tree
{
private:
    TreeNode* root, * next;

public:
    Tree()
    {
        root = NULL;
    }

    void levelOrder()                   //обход в ширину
    {
        Queue Universal;
        Universal.addToQueue(root);

        TreeNode* tmp;

        while (!Universal.isEmpty())
        {
            tmp = Universal.delQueue();
            cout << tmp->data << " ";

            if (tmp->left != NULL)
                Universal.addToQueue(tmp->left);
            if (tmp->right != NULL)
                Universal.addToQueue(tmp->right);
        }
    }

    void addToTreeHelper(int value)
    {
        addToTree(&root, value);
    }

    void addToTree(TreeNode** Ptr, int value)
    {
        if ((*Ptr) == NULL)
        {
            (*Ptr) = new TreeNode;
            (*Ptr)->data = value;
            (*Ptr)->left = (*Ptr)->right = NULL;
        }
        else
        {
            if (value < (*Ptr)->data)
                addToTree(&(*Ptr)->left, value);
            else if (value > (*Ptr)->data)
                addToTree(&(*Ptr)->right, value);
            else
                cout << "Дубликат!\n";
        }
    }

    void deleteTreeHelp(int value)
    {
        deleteTree(root, value);
    }

    void deleteTree(TreeNode* Ptr, int value)
    {
        TreeNode* parent = NULL;
        TreeNode* removed = NULL;

        while (Ptr != NULL && Ptr->data != value)
        {
            parent = Ptr;
            if (Ptr->data > value)
                Ptr = Ptr->left;
            else
                Ptr = Ptr->right;
        }

//        int peremen = Ptr->data;

        if (root != NULL)
        {
            TreeNode* child = NULL;
            if (Ptr->left == NULL || Ptr->right == NULL)
            {
                /*случай когда один ребенок*/
                if (Ptr->left == NULL)
                    child = Ptr->right;
                else
                    child = Ptr->left;

                /*если удаляем корень с одним потомком*/
                if (root->data == value)
                    root = child;
                else
                {
                    if (parent->left == Ptr)
                        parent->left = child;
                    else
                        parent->right = child;
                }

                removed = Ptr;
            }
            else            /*if(Ptr -> left != NULL || Ptr -> right != NULL)*/
            {
                /*случай когда 2 ребенка*/
                TreeNode* mostLeft = Ptr->right;

                if (mostLeft->left == NULL)
                {
                    parent = mostLeft;
                }

                while (mostLeft->left != NULL)
                {
                    parent = mostLeft;
                    mostLeft = mostLeft->left;
                }

                if (root->data == value) {
                    removed = mostLeft;

                    if (parent->left == mostLeft)
                        parent->left = NULL;
                    else
                        root->right = mostLeft->right;
                        parent->left = mostLeft->right;
                        parent = NULL;

                    root->data = mostLeft->data;
                }
                else {
                    removed = mostLeft;
                    if (mostLeft->right != NULL && mostLeft->right->data < parent->data)
                    {
                        parent->left = mostLeft->right;
                    }
                    else if(mostLeft->right != NULL)
                    {
                        Ptr->right = parent->right;
                        parent = NULL;
                    }
                    else if (parent->left != NULL)
                    {
                        parent->left = NULL;
                    }
                    else
                    {
                        parent = NULL;
                        Ptr->right = NULL;
                    }

                    Ptr->data = mostLeft->data;
                }
            }
        }
        delete removed;
    }

    void outputHelper(int totalSpace)
    {
        outputTree(root, totalSpace);
    }

    void outputTree(TreeNode* Ptr, int totalSpace)
    {
        while (Ptr != NULL)
        {
            outputTree(Ptr->right, totalSpace + 5);

            for (int i = 1; i <= totalSpace; i++)
                cout << " ";

            cout << Ptr->data << "\n";

            Ptr = Ptr->left;
            totalSpace += 5;
        }
    }
    void maxDepthHelper()
    {
        cout<<"Максимальная глубина дерева: "<<maxDepth(root)<<"\n";
    }
    int maxDepth(TreeNode* T)
    {
        if (T==NULL) return 0;
        return max(maxDepth(T->left),maxDepth(T->right))+1;
    }
    void BalanceTree()
    {
    //TODO: Циклично добавлять элементы в дерево, пока высота всех листов дерева не будет одинакова
    }
};

void instructions();
void menu();

int main()
{
//    wcout.imbue(locale(".866"));
//    wcin.imbue(locale(".866"));

    menu();

    cout << "\n\n";
    return 0;
}

void instructions()
{
    cout << "Выберите пункт меню: " <<
        "\n1 - Добавить элемент" <<
        "\n2 - Удалить элемент" <<
        "\n3 - Вывод дерева" <<
        "\n4 - Поиск максимальной глубины дерева" <<
        "\n5 - Балансировка листьев дерева" <<
        "\n6 - Выход.\n";
}

void menu()
{
    srand (time(NULL));
    Tree Universal;
    int punkt_menu, value, space = 0;

    instructions();
    do {
        cout << "\n? ";
        cin >> punkt_menu;

        switch (punkt_menu)
        {
            case 1:
                cout << "Введите число: ";
                cin >> value;
                for (int i = 0; i < value; i++)
                {
                    Universal.addToTreeHelper(rand() % 100);
                }
//                Universal.addToTreeHelper(value);
                Universal.levelOrder();
                break;
            case 2:
                cout << "Введите значение удаляемого элемента: ";
                cin >> value;

                Universal.deleteTreeHelp(value);
                Universal.levelOrder();
            case 3:
                cout << "Вывод дерева:\n\n";
                Universal.outputHelper(space);
                break;
            case 4:
                Universal.maxDepthHelper();
                break;
            case 5:
                Universal.BalanceTree();
                break;
        }

    } while (punkt_menu != 6);
}

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