Бинарное дерево(все сломалось после switch-case'a)

Рейтинг: -3Ответов: 1Опубликовано: 30.03.2023

не работает код (бинарное дерево). до добавления свич кейса все работало нормально, но как добавил перестало работать, говорит, что по указателю tree всегда значение NULL. помогите пожалуйста .код:

#include <iostream>
#include <string>
using namespace std;

struct Node{//Узел дерева
    int x;                           //То, что записываем в дерево
    Node* l, * r;                    //Указатели на новые звенья
    int data;
    //int size=0;
};

void show(Node*& Tree){//Функция обхода
    if (Tree != NULL) {              //Пока не встретится пустое звено
        show(Tree->l);               //Рекурсивная функция для вывода левого поддерева
        cout << Tree->x <<"->\t"<<Tree->data<<endl;             //Отображаем корень дерева
        show(Tree->r);               //Рекурсивная функция для вывода правого поддерева
    }
}

int get_size(Node* node)
{
    if (node->l == NULL && node->r == NULL)
        return 1;
    int left, right;
    if (node->l != NULL)
        left = get_size(node->l);
    else
        left = 0;
    if (node->r != NULL)
        right = get_size(node->r);
    else
        right = 0;
    return left + right + 1;
}

void add_node(int x, Node* MyTree, int data) //Функция добавления звена в дерево
{
    if (MyTree == NULL) {                //Если дерева нет, то создаем корень
        MyTree = new Node;               //Выделяем память под звено дерева
        MyTree->x = x;                   //Записываем данные в звено
        MyTree->data = data;
        MyTree->l = MyTree->r = NULL;    //Подзвенья инициализируем пустотой во избежание ошибок
        //MyTree->size++;
    }
    if (x < MyTree->x)                   //Если нововведенный элемент x меньше чем элемент x из семечка дерева, уходим влево
    {
        if (MyTree->l != NULL)
        {
            add_node(x, MyTree->l, data);        //При помощи рекурсии заталкиваем элемент на свободный участок
        }
        else                                           //Если элемент получил свой участок, то
        {
            MyTree->l = new Node;                      //Выделяем память левому подзвену. Именно подзвену, а не просто звену
            MyTree->l->l = MyTree->l->r = NULL;        //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
            MyTree->l->x = x;                          //Записываем в левое подзвено записываемый элемент
            MyTree->l->data = data;
            //MyTree->size++;
        }
    }
    if (x > MyTree->x)          //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо
    {
        if (MyTree->r != NULL)
        {
            add_node(x, MyTree->r,data); //При помощи рекурсии заталкиваем элемент на свободный участок
        }
        else                                          //Если элемент получил свой участок, то
        {
            MyTree->r = new Node;                 //Выделяем память правому подзвену. Именно подзвену, а не просто звену
            MyTree->r->l = MyTree->r->r = NULL;   //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
            MyTree->r->x = x;                     //Записываем в правое подзвено записываемый элемент
            MyTree->r->data = data;
            //MyTree->size++;
        }
    }
}

void del(Node*& Tree) {
    if (Tree != NULL)                //Пока не встретится пустое звено
    {
        del(Tree->l);                //Рекурсивная функция прохода по левому поддереву
        del(Tree->r);                //Рекурсивная функци для прохода по правому поддереву
        delete Tree;                 //Убиваем конечный элемент дерева
        Tree = NULL;                 //Может и не обязательно, но плохого не будет
    }

}

void change_data(Node*& Tree, int index, int data) {
    if (Tree->l != nullptr && index<Tree->x) {
        change_data(Tree->l, index, data); 
    }
    else {
        if (Tree->r != nullptr && index>Tree->x) {
            change_data(Tree->r, index, data); 
        }
        else {
            if (Tree->x == index) {
                Tree->data = data;
            }
        }
    }
}

void del_node(Node*& Tree, int index) {
    if (Tree->x > index) {
        del_node(Tree->l, index);
    }
    if (Tree->x < index) {
        del_node(Tree->r, index);
    }
    if (Tree->x == index) {
        del(Tree);
    }
}

//void get_size(Node*& Tree) { cout << Tree->size; }// return Tree->size; }

int main()
{
    /*
    Node* tree = NULL;
    for (int i = 0, j = 100; i < 10; i++, j -= rand() % 10) {
        add_node(i+1, tree, j);
    }
    show(tree);
    cout<<get_size(tree);
change_data(tree, 3, 99999);
cout << "\n------------\n";
show(tree);

del_node(tree, 3);
cout << "\n------------\n";
//show(tree);
cout<<get_size(tree);
*/
system("chcp 1251");
Node* tree = NULL;
int swt;
cout << "\n\n\nменю:\n  1- создать новое дерево\n   2- изменить значение элемента дерева\n  3- удалить элемент из бинарного дерева\n    4- вывести дерево\n 5- удалить дерево\n 6- закончить работу программы\n 7- добавить элемент в дерево\n  __ваш выбор:";
cin >> swt;
switch (swt) {
case 1:{
    int index, data, gg;
    cout << "дерево создано! сколько элементов массива вы хотите заполнить? ";
    cin >> gg;
    for (int i = 0; i < gg; i++) {
        //tree = new Node;
        cout << "введите индекс и значение элемента номер " << i + 1 << ':';
        cin >> index >> data;
        add_node(index, tree, data);
    }
    //break;
    main();
}
case 2: {
    int index, new_data;
    cout << "введите индекс и новое значение элемента, что вы хотите изменить: ";
    cin >> index >> new_data;
    change_data(tree, index, new_data);
    //break;
    main();
}
case 3: {
    int index;
    cout << "введите индекс элемента что вы хотите удалить, но учтите, что удалится все поддерево!:";
    cin >> index;
    del_node(tree, index);
    //break;
    main();
}
case 4: {
    cout << endl << endl;
    show(tree);
    cout << endl << "всего элементов: " << get_size(tree) << endl;
    //break;
    main();
}
case 5: {
    bool f;
    cout << "вы уверены?(1 - да, 0 - отмена): ";
    cin >> f;
    if (f) {
        del(tree);
        cout << "дерево удалено!";
    }
    else main();
}
case 6: {
    system("pause");
    return 0;
}
case 7: {
    int index, data;
    cout << "введите индекс и значение нового элемента: ";
    cin >> index >> data;
    add_node(index, tree, data);
    //break;
    main();
}
default: {
    main();
}
}
}

Ответы

▲ 0

Ваш main() начинается так:

int main() {
    Node* tree = NULL;

Т.е. при каждом вызове вы начинаете работу с нуля, с пустого дерева.

Используйте цикл, а не рекурсию, тем более что main() функция особая, и с ней так поступать не принято!