Бинарное дерево(все сломалось после switch-case'a)
не работает код (бинарное дерево). до добавления свич кейса все работало нормально, но как добавил перестало работать, говорит, что по указателю 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();
}
}
}
Источник: Stack Overflow на русском