Загрузка данных


#include <iostream>
#include <random>
#include <ctime>
#include <cstdlib>
using namespace std;

struct ttree
{
    int inf;
    ttree *left;
    ttree *rigth;
};

// Добавление нового элемента
ttree *addtree(ttree *proot, int inf)
{
    ttree *nl, *pr = NULL, *ps;
    bool b = false;

    nl = new ttree;
    nl->inf = inf;
    nl->left = NULL;
    nl->rigth = NULL;

    if (proot == NULL) return nl;

    ps = proot;
    while (ps != NULL)
    {
        pr = ps;
        b = (inf < ps->inf);
        if (b) ps = ps->left;
        else ps = ps->rigth;
    }

    if (b) pr->left = nl;
    else pr->rigth = nl;

    return proot;
}

// Прямой обход: корень - левое - правое
void pretree(ttree *p)
{
    if (p == NULL) return;
    cout << p->inf << "  ";
    pretree(p->left);
    pretree(p->rigth);
}

// Обратный обход: левое - правое - корень
void posttree(ttree *p)
{
    if (p == NULL) return;
    posttree(p->left);
    posttree(p->rigth);
    cout << p->inf << "  ";
}

// Обход в порядке возрастания: левое - корень - правое
void wrtree(ttree *p)
{
    if (p == NULL) return;
    wrtree(p->left);
    cout << p->inf << "  ";
    wrtree(p->rigth);
}

// Поиск элемента с заданным ключом
void poisktree(ttree *p, int key, bool &b, int &inf)
{
    if ((p != NULL) && (b != true))
    {
        if (p->inf != key)
        {
            poisktree(p->left, key, b, inf);
            poisktree(p->rigth, key, b, inf);
        }
        else
        {
            b = true;
            inf = p->inf;
        }
    }
    return;
}

// Поиск элемента с максимальным ключом
int poiskmaxtree(ttree *p)
{
    while (p->rigth != NULL) p = p->rigth;
    return p->inf;
}

// Удаление всего дерева
ttree *deltree(ttree *p)
{
    if (p == NULL) return NULL;
    deltree(p->left);
    deltree(p->rigth);
    delete(p);
    p = NULL;
    return NULL;
}

// Удаление элемента с заданным ключом
ttree *dellist(ttree *proot, int inf)
{
    ttree *ps = proot, *pr = proot, *w, *v = NULL;

    while ((ps != NULL) && (ps->inf != inf))
    {
        pr = ps;
        if (inf < ps->inf) ps = ps->left;
        else ps = ps->rigth;
    }

    if (ps == NULL) return proot;

    // Если узел не имеет дочерей
    if ((ps->left == NULL) && (ps->rigth == NULL))
    {
        if (ps == pr)
        {
            delete(ps);
            return NULL;
        }
        if (pr->left == ps)
            pr->left = NULL;
        else
            pr->rigth = NULL;
        delete(ps);
        return proot;
    }

    // Если узел имеет дочь только справа
    if (ps->left == NULL)
    {
        if (ps == pr)
        {
            ps = ps->rigth;
            delete(pr);
            return ps;
        }

        if (pr->left == ps)
            pr->left = ps->rigth;
        else
            pr->rigth = ps->rigth;

        delete(ps);
        return proot;
    }

    // Если узел имеет дочь только слева
    if (ps->rigth == NULL)
    {
        if (ps == pr)
        {
            ps = ps->left;
            delete(pr);
            return ps;
        }

        if (pr->left == ps)
            pr->left = ps->left;
        else
            pr->rigth = ps->left;

        delete(ps);
        return proot;
    }

    // Если узел имеет двух дочерей
    w = ps->left;
    if (w->rigth == NULL)
        w->rigth = ps->rigth;
    else
    {
        while (w->rigth != NULL)
        {
            v = w;
            w = w->rigth;
        }
        v->rigth = w->left;
        w->left = ps->left;
        w->rigth = ps->rigth;
    }

    if (ps == pr)
    {
        delete(ps);
        return w;
    }

    if (pr->left == ps)
        pr->left = w;
    else
        pr->rigth = w;

    delete(ps);
    return proot;
}

// Подсчет числа листьев
int countLeaves(ttree *p)
{
    if (p == NULL) return 0;
    if (p->left == NULL && p->rigth == NULL) return 1;
    return countLeaves(p->left) + countLeaves(p->rigth);
}

// Вспомогательная функция для построения сбалансированного дерева
void addBalanced(ttree *&root, int a[], int l, int r)
{
    if (l > r) return;

    int m = (l + r) / 2;
    root = addtree(root, a[m]);

    addBalanced(root, a, l, m - 1);
    addBalanced(root, a, m + 1, r);
}

int main()
{
    srand(time(0)); // чтобы менялись числа при каждом запуске

    ttree *proot = NULL;
    int a[10];

    for (int i = 0; i < 10; i++)
    {
        a[i] = rand() % 101 - 50; // генерация случайного числа
    }

    // Сортировка для построения сбалансированного дерева
    for (int i = 0; i < 9; i++)
    {
        for (int j = i + 1; j < 10; j++)
        {
            if (a[i] > a[j])
            {
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }

    // Создание сбалансированного дерева поиска
    addBalanced(proot, a, 0, 9);

    cout << "Сгенерированные числа: ";
    for (int i = 0; i < 10; i++)
        cout << a[i] << " ";
    cout << endl;

    cout << "Прямой обход: ";
    pretree(proot);
    cout << endl;

    cout << "Обратный обход: ";
    posttree(proot);
    cout << endl;

    cout << "В порядке возрастания: ";
    wrtree(proot);
    cout << endl;

    cout << "Число листьев в дереве: " << countLeaves(proot) << endl;

    bool b = false;
    int inf = 0;
    poisktree(proot, 0, b, inf);
    if (b) cout << "Элемент 0 найден" << endl;
    else cout << "Элемент 0 не найден" << endl;

    proot = deltree(proot);
    return 0;
}