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

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

class BinaryTree {
private:
    TreeNode* root;
    
    TreeNode* insert(TreeNode* node, double value) {
        if (!node) return new TreeNode(value);
        
        if (value < node->data) node->left = insert(node->left, value);
        else node->right = insert(node->right, value);
        
        return node;
    }
    
    TreeNode* remove(TreeNode* node, double 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 contains(TreeNode* node, double value) {
        if (!node) return false;
        if (node->data == value) return true;
        if (value < node->data) return contains(node->left, value);
        return contains(node->right, value);
    }
    
    void inOrder(TreeNode* node, vector<double>& result) {
        if (!node) return;
        inOrder(node->left, result);
        result.push_back(node->data);
        inOrder(node->right, result);
    }
    
public:
    BinaryTree() : root(nullptr) {
        cout << "Создано пустое бинарное дерево" << endl;
    }
    
    void add(double value) {
        root = insert(root, value);
        cout << "Добавлен элемент: " << value << endl;
    }
    
    void remove(double value) {
        if (contains(value)) {
            root = remove(root, value);
            cout << "Удален элемент: " << value << endl;
        } else {
            cout << "Элемент " << value << " не найден" << endl;
        }
    }
    
    bool contains(double value) {
        bool found = contains(root, value);
        cout << "Элемент " << value << (found ? " найден" : " не найден") << " в дереве" << endl;
        return found;
    }
    
    vector<double> getElements() {
        vector<double> result;
        inOrder(root, result);
        return result;
    }
    
    void print() {
        vector<double> elements = getElements();
        cout << "Элементы дерева (в порядке возрастания): ";
        for (double elem : elements) {
            cout << elem << " ";
        }
        cout << endl;
    }
};

int main() {
    SetConsoleOutputCP(65001);
    
    BinaryTree tree;
    
    cout << "=== Работа с бинарным деревом ===" << endl;
    
    tree.add(5.0);
    tree.add(3.0);
    tree.add(7.0);
    tree.add(1.0);
    tree.add(4.0);
    
    tree.print();
    
    tree.contains(3.0);
    tree.contains(10.0);
    
    tree.remove(3.0);
    tree.print();
    
    tree.remove(10.0); // Несуществующий элемент
    
    return 0;
}
Соседние файлы в папке Лаба1