Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2020, 16:41   #1
kitkat1000
 
Регистрация: 29.01.2020
Сообщений: 8
По умолчанию Почему удаляются только те чётные элементы которые я добавил, а не все которые есть в бинарном дереве?

Почему удаляются только те чётные элементы которые я добавил, а не все которые есть в бинарном дереве?
Код:
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int tabs = 0;
 
struct Node
{
    int Data;
    Node* Left;
    Node* Right;
};
 
void Add(int aData, Node*& aNode)
{
    if(!aNode)
    {
        aNode = new Node;
        aNode->Data = aData;
        aNode->Left = 0;
        aNode->Right = 0;
        return;
    }
    else
    {
        if(aNode->Data > aData)
        {
            Add(aData, aNode->Left);
        }
        else
        {
            Add(aData, aNode->Right);
        }
    }
}
 
void print(Node* aNode)
{
    if(!aNode) return;
    tabs+= 5;
    print(aNode->Left);
    for(int i = 0; i < tabs; i++) cout <<" ";
    {
        cout <<aNode->Data<<endl;
    }
    print(aNode->Right);
    tabs-= 5;
    return;
}
 
void pr_obh(Node*& aNode)
{
    if(aNode == NULL) return;
    pr_obh(aNode->Left);
    cout<<aNode->Data<<endl;
    pr_obh(aNode->Right);
}
 
void obr_obh(Node*& aNode)
{
    if(aNode == NULL) return;
    obr_obh(aNode->Right);
    cout <<aNode->Data<<endl;
    obr_obh(aNode->Left);
}
 
void add_elem(int aData, Node*& aNode)
{
    if(!aNode)
    {
        aNode = new Node;
        aNode->Data = aData;
        aNode->Left = 0;
        aNode->Right = 0;
        return;
    }
    else
    {
        if(aData < aNode->Data)
        {
            add_elem(aData, aNode->Left);
        }
        else if(aData > aNode->Data)
        {
            add_elem(aData, aNode->Right);
        }
    }
}
 
Node* delete_elem(int aData, Node*& aNode)
{
    if(aNode == NULL)
        return aNode;
        
    if(aNode->Data == aData)
    {
        Node* temp;
        if(aNode->Right == NULL)
        {
            temp = aNode->Left;
        }
        else
        {
            Node* temp2 = aNode->Right;
            
            if(aNode->Left == NULL)
            {
                temp2->Left = aNode->Left;
                temp = temp2;
            }
            else
            {
                Node* temp3 = temp2->Left;
                while(temp3->Left != NULL)
                {
                    temp2 = temp3;
                    temp3 = temp2->Left;
                }
                temp2->Left = temp3->Right;
                temp3->Left = aNode->Left;
                temp3->Right = aNode->Right;
            }
        }
        delete aNode;
        return temp;
    }
    else if(aData < aNode->Data)
    {
        aNode->Left = delete_elem(aData, aNode->Left);
    }
    else
    {
        aNode->Right = delete_elem(aData, aNode->Right);
    }
    return aNode;
}
 
void Delete_tree(Node*& aNode)
{
    if(!aNode) return;
    Delete_tree(aNode->Left);
    Delete_tree(aNode->Right);
    delete aNode;
    return;
}
 
int main()
{
    Node* Root = 0;
    int N;
    int element;
    setlocale(0, "rus");
    cout <<"Введите количество элементов будующего дерева: ";
    cin >> N;
    for(int i = 0; i < N; i++)
    {
        Add(rand() % 100, Root);
    }
    cout <<"Вывод дерева: "<<endl;
    print(Root);
    cout << endl;
    
    cout <<"Прямой обход: "<<endl;
    pr_obh(Root);
    cout << endl;
    
    cout <<"Обратный обход: "<<endl;
    obr_obh(Root);
    cout << endl;
    
    cout <<"Добавление нового элемента"<<endl;
    cout <<"Введите элемент: ";
    cin >> element;
    add_elem(element, Root);
    
    cout <<"Вывод дерева: "<<endl;
    print(Root);
    cout << endl;
    
    cout <<"Удаление чётных элементов"<<endl;
    for(int i = 0; i < N; i++)
    {
        if (element % 2 == 0)
        {
            delete_elem(element, Root);
        }
    }
    
    cout <<"Вывод дерева: "<<endl;
    print(Root);
    cout << endl;
    
    Delete_tree(Root);
    cout <<"Вся динамическая память очищена";
    
    return 0;
}
Что не так?
Изображения
Тип файла: png 3.png (7.7 Кб, 8 просмотров)
kitkat1000 вне форума Ответить с цитированием
Старый 29.10.2020, 17:52   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Зачем две одинаковые функции Add и add_elem?
По поводу удаления. Функция delete_elem удаляет элемент, содержащий указанное значение. Вы же вызываете эту функцию N раз с одним и тем же значением, которое было введено с клавиатуры.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести элементы массива,которые встречаются в массиве только один раз Lamar15 Помощь студентам 2 09.03.2020 20:43
Написать программу, которая считывает с клавиатуры предложения и выводит только те, которые имеют цитаты, то есть заключены в кавычках («») Falling down Помощь студентам 0 01.11.2019 23:47
Даны два слова. Напечатать только те буквы слов, которые встречаются в обоих словах только один раз. EDWIN503 Общие вопросы по Java, Java SE, Kotlin 3 25.09.2017 03:37
две задачи на Паскале: 1) Вывести все натуральные числа, кратные 5, но которые не превышают число N, введенное пользователем с клавиатуры 2) есть ли среди 15 чисел нулевые элементы Лю*** Помощь студентам 1 11.01.2017 16:49
логическая функция same(t), определяющая, есть ли в бинарном дереве T хотя бы два одинаковых элемента 123456789igor Паскаль, Turbo Pascal, PascalABC.NET 1 30.05.2011 00:22