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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Оператор break как оператор go to next http://www.cyberforum.ru/cpp-beginners/thread750188.html
Подскажите, в этом примере break эквивалентна действию оператора go to next?
C++ Создание программы для С++ Помогите пожалуйста - мне надо откомпилировать файл моей программы в Borland C++. Помогите пожалуйста, жду http://www.cyberforum.ru/cpp-beginners/thread750185.html
Принцип 3d программ C++
Хочеться сделать программу там где ты ходиш в мелкой комнатке с стенками для освоения зд программ. А как принцып какой? там матрица какаято или че?
C++ Площадь фигуры ограниченной кусочно-линейной функцией и осью абсцисс
Нужно написать программу, которая бы методом трапеций вычисляла площадь фигуры ограниченной графиком показанным на рисунке и x=0. Интервал - Функции нашёл: на интервале (-беск;-2) y=-2.5x-6 (-2;0) y=x+1 (0;1) y=-2x+1 (1;беск) y=4/3x-0.2 ...
C++ Узнать что стоит на определённом месте (0 или 1) http://www.cyberforum.ru/cpp-beginners/thread750162.html
Уважаемые программисты! Помогите исправить код или решить задачу. Представим себе бесконечную последовательность цифр, составленную из записанных друг за другом возрастающих степеней десятки. Вот начало этой последовательности: 110100100010000… Всё, что надо — определить, какая цифра находится в такой последовательности на определённом месте. Исходные данные В первой строке находится целое...
C++ Задача на классы Я не понимаю как написать функцию чтобы она проверяла или числа с плавающей запятой! Помогите! #include <iostream.h> #include <time.h> #include <conio.h> class Rectangle{ private: float length; подробнее

Показать сообщение отдельно
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 143
30.12.2012, 20:32     Удаление Узла бинарного дерева
Добрый вечер.
Имеем Бинарное дерево поиска.

При удалении некоторого узла . возникают три случая. Один из случаев , наличие у удаляемого узла обоих дочерних узлов.

При удалении такого узла . необходимо заменять его на самый левый узел правого поддерева или же самый правый узел левого поддерева.

Вопрос в следующем . как рекурсивно найти самый левый . правого поддерева. и его родителя.

Пробовал сделать через while , но для некоторых случаев данный код не корректен.

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
   /*
             * Крайний левый потомок , правого поддерева
             * l будем использовать как родителя крайнего левого узла
             * а  - бегает по циклу
             * p - есть удаляемый узел
             * s - тот самый левый крайний узел
             */
            l = p; 
            bintree *a = p->right;    // переходим на правую ветвь
            bintree *s;                   
            s->inf = (p->right)->inf; // задаем s начальное значение . 
            /*
             * Цикл работает пока есть узлы
             * 
             */
             
            while(a->left || a->right){ 
                if(a->left){ // отдаем предпочтение левому поддереву 
                   l = a;  // родитель крайнего левого
                   a=a->left; // переход в крайний левый
                   s->inf = a->inf; // присваиваем данное значение
                }
                else if(a->right)a=a->right; // иначе если нет левого . бежим вправо , может там найдем крайний левый..
            }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru