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


#include <iostream>
#include <cstdlib>
#include <ctime>

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

// Добавление элемента в дерево поиска
ttree* addtree(ttree *proot, int inf) {
    ttree *nl = new ttree;
    nl->inf = inf;
    nl->left = NULL;
    nl->right = NULL;
    if (proot == NULL) return nl;

    ttree *ps = proot, *pr;
    bool b;
    while (ps != NULL) {
        pr = ps;
        b = (inf < ps->inf);
        if (b) ps = ps->left;
        else ps = ps->right;
    }
    if (b) pr->left = nl;
    else pr->right = nl;
    return proot;
}

// Создание сбалансированного дерева из отсортированного массива
ttree* createBalanced(int arr[], int start, int end) {
    if (start > end) return NULL;
    int mid = (start + end) / 2;
    ttree *root = new ttree;
    root->inf = arr[mid];
    root->left = createBalanced(arr, start, mid - 1);
    root->right = createBalanced(arr, mid + 1, end);
    return root;
}

// Прямой обход (Корень -> Левое -> Правое)
void preorder(ttree *p) {
    if (p == NULL) return;
    std::cout << p->inf << " ";
    preorder(p->left);
    preorder(p->right);
}

// Обратный обход (Левое -> Правое -> Корень)
void postorder(ttree *p) {
    if (p == NULL) return;
    postorder(p->left);
    postorder(p->right);
    std::cout << p->inf << " ";
}

// Симметричный обход (по возрастанию)
void inorder(ttree *p) {
    if (p == NULL) return;
    inorder(p->left);
    std::cout << p->inf << " ";
    inorder(p->right);
}

// Поиск узла и его родителя по ключу
ttree* findParent(ttree* root, int key, ttree** parent) {
    ttree* current = root;
    *parent = NULL;
    while (current != NULL && current->inf != key) {
        *parent = current;
        if (key < current->inf)
            current = current->left;
        else
            current = current->right;
    }
    return current;
}

// Удаление всей ветви (поддерева) начиная с узла
void deleteSubtree(ttree* node) {
    if (node == NULL) return;
    deleteSubtree(node->left);
    deleteSubtree(node->right);
    delete node;
}

// Удаление ветви с вершиной, имеющей заданный ключ
ttree* deleteBranch(ttree* root, int key) {
    ttree* parent = NULL;
    ttree* target = findParent(root, key, &parent);

    if (target == NULL) {
        std::cout << "Ключ " << key << " не найден в дереве.\n";
        return root;
    }

    // Если удаляется корень
    if (parent == NULL) {
        deleteSubtree(target);
        return NULL;
    }

    // Отсоединяем узел от родителя
    if (parent->left == target)
        parent->left = NULL;
    else
        parent->right = NULL;

    // Удаляем всё поддерево
    deleteSubtree(target);
    
    std::cout << "Ветвь с ключом " << key << " удалена.\n";
    return root;
}

// Удаление всего дерева (для очистки памяти)
void deltree(ttree *p) {
    if (p == NULL) return;
    deltree(p->left);
    deltree(p->right);
    delete p;
}

int main() {
    setlocale(LC_ALL, "Russian");
    
    // Создаём массив чисел от -50 до 50
    const int SIZE = 101;
    int arr[SIZE];
    for (int i = 0; i < SIZE; i++) {
        arr[i] = -50 + i;
    }

    // Строим сбалансированное дерево
    ttree *root = createBalanced(arr, 0, SIZE - 1);

    std::cout << "Симметричный обход (по возрастанию):\n";
    inorder(root);
    std::cout << "\n\n";

    std::cout << "Прямой обход (preorder):\n";
    preorder(root);
    std::cout << "\n\n";

    std::cout << "Обратный обход (postorder):\n";
    postorder(root);
    std::cout << "\n\n";

    // Выполнение индивидуального задания №3
    int key;
    std::cout << "Введите ключ вершины, ветвь которой нужно удалить: ";
    std::cin >> key;

    root = deleteBranch(root, key);

    std::cout << "\nДерево после удаления ветви (симметричный обход):\n";
    inorder(root);
    std::cout << "\n";

    // Очистка памяти
    deltree(root);
    
    return 0;
}