Форум программистов, компьютерный форум CyberForum.ru

Простая организация удаление узла в бинарном дереве - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Стивен Прата Кто Читал его ? - Нужен Совет http://www.cyberforum.ru/cpp-beginners/thread827926.html
Нужна книжка по изучению C++ ,так сказать "С НУЛЯ",чтоб всё разжевывалось. Остановился На авторе Стивен Прата ,книга - Язык программирования C++ лекции и упражнения ,так вот ,вопрос в том какое именно издание выбрать?6-е издание новое там много опечаток и не так обьяняеться хорошо,как я понял...Многие советуют 4-е издание.Кто читал?Какое посоветуете? ВОТ один из комментариев человека который...
C++ Массив структур Как отсортировать массив структур или вектор (значения не имеет) по полю типа float? Спасибо Вот нашёл пример на форуме, но не могу понять выделенные строки и по какому полю идёт сортировка(думаю по полю points) #include "stdafx.h" #include <stdio.h> #include <string.h> #include <iostream> #include <iterator> #include <vector> #include <sstream> http://www.cyberforum.ru/cpp-beginners/thread827914.html
Нужна литература по использованию popcap framework C++
Недавно нашел в интернете статью про 2D игры написанных на с++ с помощью popcap framework, но литературы я не нашел на эту тему, может вы посоветуете литературу на русском языке по использованию popcap framework
C++ Считывание уже выведенных символов на экране консоли
Привет всем тем, кто любит пушистых зверушек, да и всем остальным тоже. Ну да ладно, Допустим на экран выведена некоторая информация, путь будет cout<<endl; system("ver"); на экране выведется: Пустая строка и на следующей "Microsoft Windows " Собственно вопрос, можно ли считать именно с экрана по координатно выведенные символы через HANDLE или как либо по другому ?
C++ передача массива по значению http://www.cyberforum.ru/cpp-beginners/thread827894.html
Такая проблема Написал лабу "решение СЛУ методом Гаусса" Все корни идет верно. Но при проверке корней, обнаружил, что исходная матрица преобразовалась в глобальной области кода, хотя в функцию она передавалась по значению, а не по ссылке. Нужно, чтобы исходная матрица после не менялась в глобальной области Матрица создавалась через указатель на указатель Пока что код привести не могу,...
C++ Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,*,- дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,*,-. группой букв называют такую последовательность букв, которой не предшествует и за которой не следует буква. дальше я сам смогу)) помогите с определением этой группы пожалуйста подробнее

Показать сообщение отдельно
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056

Простая организация удаление узла в бинарном дереве - C++

04.04.2013, 15:01. Просмотров 471. Ответов 7
Метки (Все метки)

Добрый день. У меня получился сильно громоздкий код для удаление узла дерева (не корня).
Нет никаких идей по поводу упрощения. Может кто-то подскажет, как сделать всё более компактно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
struct BinTree
{
    int key;
    BinTree* left_node;
    BinTree* right_node;
};
 
// Удалиние узла (не корня). Возращает истину при удачном удалении узла.
bool free_node(BinTree* root, int key)
{
    if (!root)
    {
        return false;
    }
 
    // Если левый узел соответствует искомому ключу.
    if (root->left_node && root->left_node->key == key)
    {
        // Если обе ветки пустые.
        if (!root->left_node->left_node && !root->left_node->right_node)
        {
            delete root->left_node;
            root->left_node = NULL;
            return true;
        }
        // Если правая ветка пустая.
        if (root->left_node->left_node && !root->left_node->right_node)
        {
            BinTree* tmp = root->left_node;
            root->left_node = root->left_node->left_node;
            delete tmp;
            return true;
        }
        // Если левая ветка пустая.
        if (root->left_node->right_node && !root->left_node->left_node)
        {
            BinTree* tmp = root->left_node;
            root->left_node = root->left_node->right_node;
            delete tmp;
            return true;
        }
        // Если обе ветки имеют узлы.
        if (root->left_node->left_node && root->left_node->right_node)
        {
            BinTree* tmp_need = root->left_node; // запомним удаляемый узел.
            BinTree* tmp_node = root->left_node->left_node; // запомним левый узел.
            root->left_node = root->left_node->right_node; // присоединим правый узел.
            BinTree* tmp_left = root->left_node; // запомним, для поиска "дна".
 
            while (tmp_left->left_node)
            {
                tmp_left = tmp_left->left_node;
            }
 
            tmp_left->left_node = tmp_node;
            delete tmp_need;
            return true;
        }
    }
 
    // Аналогично и для правой части.
    if (root->right_node && root->right_node->key == key)
    {
        if (!root->right_node->left_node && !root->right_node->right_node)
        {
            delete root->right_node;
            root->right_node = NULL;
            return true;
        }
        if (root->right_node->left_node && !root->right_node->right_node)
        {
            BinTree* tmp = root->right_node;
            root->right_node = root->right_node->left_node;
            delete tmp;
            return true;
        }
        if (root->right_node->right_node && !root->right_node->left_node)
        {
            BinTree* tmp = root->right_node;
            root->right_node = root->right_node->right_node;
            delete tmp;
            return true;
        }
        if (root->right_node->left_node && root->right_node->right_node)
        {
            BinTree* tmp_need = root->right_node;
            BinTree* tmp_node = root->right_node->left_node;
            root->right_node = root->right_node->right_node;
            BinTree* tmp_right = root->right_node;
 
            while (tmp_right->left_node)
            {
                tmp_right = tmp_right->left_node;
            }
 
            tmp_right->left_node = tmp_node;
            delete tmp_need;
            return true;
        }
    }
 
    if (key < root->key)
    {
        free_node(root->left_node, key); // Если ключ меньше - пойдём налево.
    }
 
    if (key > root->key)
    {
        free_node(root->right_node, key); // Если ключ больше - направо.
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru