Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
3.67 Кб
Скачать
#include <iostream>
#include <windows.h>
using namespace std;

struct TreeNode {
    int data;
    TreeNode* left;
    TreeNode* right;
    
    TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}
};

class BinarySearchTree {
private:
    TreeNode* root;
    
    TreeNode* insert(TreeNode* node, int value) {
        if (!node) return new TreeNode(value);
        
        if (value < node->data) node->left = insert(node->left, value);
        else if (value > node->data) node->right = insert(node->right, value);
        
        return node;
    }
    
    TreeNode* remove(TreeNode* node, int value) {
        if (!node) return nullptr;
        
        if (value < node->data) node->left = remove(node->left, value);
        else if (value > node->data) node->right = remove(node->right, value);
        else {
            if (!node->left) {
                TreeNode* temp = node->right;
                delete node;
                return temp;
            } else if (!node->right) {
                TreeNode* temp = node->left;
                delete node;
                return temp;
            }
            
            TreeNode* temp = minValueNode(node->right);
            node->data = temp->data;
            node->right = remove(node->right, temp->data);
        }
        return node;
    }
    
    TreeNode* minValueNode(TreeNode* node) {
        TreeNode* current = node;
        while (current && current->left) current = current->left;
        return current;
    }
    
    bool search(TreeNode* node, int value) {
        if (!node) return false;
        if (node->data == value) return true;
        if (value < node->data) return search(node->left, value);
        return search(node->right, value);
    }
    
    void inOrder(TreeNode* node) {
        if (!node) return;
        inOrder(node->left);
        cout << node->data << " ";
        inOrder(node->right);
    }
    
    void destroyTree(TreeNode* node) {
        if (!node) return;
        destroyTree(node->left);
        destroyTree(node->right);
        delete node;
    }
    
public:
    BinarySearchTree() : root(nullptr) {
        cout << "Создано пустое бинарное дерево поиска" << endl;
    }
    
    ~BinarySearchTree() {
        destroyTree(root);
        cout << "Дерево удалено" << endl;
    }
    
    void add(int value) {
        root = insert(root, value);
        cout << "Добавлен элемент: " << value << endl;
    }
    
    void remove(int value) {
        if (contains(value)) {
            root = remove(root, value);
            cout << "Удален элемент: " << value << endl;
        } else {
            cout << "Элемент " << value << " не найден" << endl;
        }
    }
    
    bool contains(int value) {
        bool found = search(root, value);
        cout << "Элемент " << value << (found ? " найден" : " не найден") << endl;
        return found;
    }
    
    void print() {
        cout << "Элементы дерева (в порядке возрастания): ";
        inOrder(root);
        cout << endl;
    }
};

int main() {
    SetConsoleOutputCP(65001);
    
    BinarySearchTree bst;
    
    bst.add(5);
    bst.add(3);
    bst.add(7);
    bst.add(1);
    bst.add(4);
    
    bst.print();
    
    bst.contains(3);
    bst.contains(10);
    
    bst.remove(3);
    bst.print();
    
    bst.remove(10); // несуществующий элемент
    
    return 0;
}
Соседние файлы в папке Лаба2