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

Удаление элемента из бинарного дерева - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ ошибка Run-Time Check Failure #2 http://www.cyberforum.ru/cpp-beginners/thread1498347.html
под конец програмки освобождал память и ошибка пропадала но происходило аварийное завершение ( подскажите где проблема . class publication { protected: string name; float price; public: publication() :name("N/A"), price(0.0)
C++ Посоветуйте книгу по Си++ Добрый вечер. Порядка года назад я очень хотел изучить языки Си и Си++, но не знал о них вобще ничего. Поставив себе эту цель, я начал грызть литературу по данным языкам. Сперва прочел книгу Лафоре - ООП и Си++, буквально вгрызаясь в каждую строчку книги, чтобы понять смысл всего, о чем там говорится, а так же выполнял все упражнения из нее, книга оказалась оооочень удачным введением для... http://www.cyberforum.ru/cpp-beginners/thread1498318.html
C++ Не могу сдвинуться с места в изучении C++; Не знаю, как программировать эффективно
Я изучаю C++ уже больше года, но чувствую, что до сил пор не умею им пользоваться. Большая часть сил тратится на такие тривиальный задачи, как создание функций работы с файлами (возвратить N-ную строку из файла, определить количество строк в файле, удалять из строк недопустимые символы). Это очень скучно, а еще и в конечном итоге получается что-то очень баганное и неопрятное. А это заставляет...
Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? C++
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
C++ Безопасная работа с памятью в OpenMP С++ http://www.cyberforum.ru/cpp-beginners/thread1498291.html
Добрый день. Вопрос связан с тем как можно добавлять элементы к общему динамическому массиву в параллельных потоках. По сути задачи приходится к созданному многомерному vector добавлять новые элементы. Пусть есть, например, vector<vector<int>> A. Первая размерность уже проинициализрована полностью (например, 0-N-1). Есть гарантия, что внутри потоков происходит обращение к собственному набору...
C++ Генерация и проверка серийного номера, как реализовать? Мне нужно, скажем так, защитить программу - написать функцию генерации и проверки уникального серийного номера для каждой копии программы. Пока не совсем понимаю, в каком направлении копать. Я знаю, что как-то можно получить ID процессора или винчестера и отталкиваться от этого. (А если, скажем программа на виртуалке будет запущена, то id оборудования там будут одинаковые?) подробнее

Показать сообщение отдельно
Геомеханик
 Аватар для Геомеханик
517 / 324 / 253
Регистрация: 26.06.2015
Сообщений: 738
14.07.2015, 02:06     Удаление элемента из бинарного дерева
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
112
113
#include <iostream>
#include <cstdlib>
 
struct Tree {
    int   val;
    Tree* left;
    Tree* right;
};
 
Tree* InsertNode(Tree* node, int val);
void  PrintNode(std::ostream& _out, const Tree* node);
void  ClearNode(Tree* node);
 
 
//удаление
Tree* DeleteNode(Tree* node, int val){
    if(node == NULL)
        return node;
 
    if(val == node->val){
 
        Tree* tmp;
        if(node->right == NULL)
            tmp = node->left;
        else {
 
            Tree* ptr = node->right;
            if(ptr->left == NULL){
                ptr->left = node->left;
                tmp = ptr;
            } else {
 
                Tree* pmin = ptr->left;
                while(pmin->left != NULL){
                    ptr  = pmin;
                    pmin = ptr->left;
                }
                ptr->left   = pmin->right;
                pmin->left  = node->left;
                pmin->right = node->right;
                tmp = pmin;
            }
        }
 
        delete node;
        return tmp;
    } else if(val < node->val)
        node->left  = DeleteNode(node->left, val);
    else
        node->right = DeleteNode(node->right, val);
    return node;
}
 
 
int main(void){
    Tree* tree = NULL;
    for(int i = 0; i < 20; ++i)
        tree = InsertNode(tree, std::rand() % 10);
    
    PrintNode(std::cout, tree);
    std::cout << std::endl;
 
    tree = DeleteNode(tree, 5);
    tree = DeleteNode(tree, 2);
    tree = DeleteNode(tree, 9);
    
    PrintNode(std::cout, tree);
    ClearNode(tree);
    return 0;
}
 
 
//вставка
Tree* InsertNode(Tree* node, int val){
    if(node == NULL){
        node = new (std::nothrow) Tree();
        if(node != NULL){
            node->val  = val;
            node->left = node->right = NULL;
        }
        return node;
    }
 
    if(val < node->val)
        node->left  = InsertNode(node->left, val);
    else
        node->right = InsertNode(node->right, val);
    return node;
}
 
//печать
void PrintNode(std::ostream& _out, const Tree* node){
    if(node != NULL){
        if(node->left != NULL)
            PrintNode(_out, node->left);
 
        _out << node->val << ' ';
 
        if(node->right != NULL)
            PrintNode(_out, node->right);
    }
}
 
//удаление всего
void ClearNode(Tree* node){
    if(node != NULL){
        if(node->left != NULL)
            ClearNode(node->left);
        if(node->right != NULL)
            ClearNode(node->right);
        delete node;
    }
}
Проверка работы кода
 
Текущее время: 06:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru