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

Удаление узла из дерева - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разделить на два массива http://www.cyberforum.ru/cpp-beginners/thread209694.html
Есть N строк вида: a1 b2 c3 хочу разделить их на два символьных массива что бы a,b,c в один, а числа в другой. Код: void main() { int N; char c,t;
C++ В каждой строке матрицы заменить на 0 все элементы до первого отрицательного элемента Доброго времени суток! Помогите, пожалуйста, с задачей: Среда CodeGear RAD Studio 2009. Разработать алгоритм и отладить программу, используя динамический массив. Дана матрица А(m, n). В каждой строке матрицы заменить на 0 все элементы до первого отрицательного элемента. #include <clocale> #include <iostream> #include <conio.h> #pragma hdrstop using namespace std;... http://www.cyberforum.ru/cpp-beginners/thread209691.html
Структура с массивом C++
Доброго времени суток, форумчане! Нужна помощь ) Есть задание: описать структуру с именем train, содержащую поля: - название пункта назначения; - номер поезда; - время отправления; Написать программу, выполняющую слудующие действия: - ввод с клавиатуры данных в массив, состоящий из 9 структур типа train; - вывод на экран информации о пункте назначения, в который отправляется поезд,...
Число Фибоначчи C++
Дан одномерный массив А неупорядоченных натуральных чисел.Вывести на экран те элементы массива, которые нельзя представить суммой двух чисел Фибоначчи! помогите пожалуйста!
C++ Определить сможет ли белый слон одним ходом пройти на поле http://www.cyberforum.ru/cpp-beginners/thread209648.html
Поле шахматной доски определяется парой натуральных целых чисел, каждое из которых не превосходит восьми: Первое число номер вертикали при счете слево на право Второе номер горизонтали при счете с низу в верх Даны натуральные числа - a, b, c, d, e, f, каждое из которых не превосходит восьми. Определить сможет ли: Белый слон (a, b) ОДНИМ ходом пройти на поле (e, f) Не попав при этом под...
C++ Двунаправленный список Чемпион мира по футболу. Страна, год последней победы, число побед. Сортировка по названию. Вычисление среднего числа титулов всех чемпионов в списке. 1 . Сформировать структуру типа A . Реализовать функцию ввода данных и вывода содержимого объекта А на экран. 2. Сформировать список типа B из объектов А («B» выбирается по номеру варианта). Реализовать функцию вывода содержимого всей очереди... подробнее

Показать сообщение отдельно
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767

Удаление узла из дерева - C++

13.12.2010, 13:33. Просмотров 527. Ответов 1
Метки (Все метки)

сделав функции добавления,поиска,пару обходов и вывод ввиде дерева в консоли(жаль что нельзя размер по x изменить) при тестировании возникла проблема удаления.
суть в том что когда я удаляю элементы если я удалю все элементы левого поддерева то,теоретически,корнем должен стать узел из правого поддерева но! вылетает прога тогда.
вот почти рабочая функция.что не так?
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
int rightmost(uzel *root)//Г±Г*ìûé ГЇГ°Г*âûé
{
  while (root->right != NULL)//ïîêГ* Г*ГҐ äîéäåò äî ГЇГ°Г*âîãî Г± ññûëêîé 0
    root = root->right;//ГЇГ® ГЇГ°Г*âûì ïîäóçëГ*Г¬ ГёГ*ГЈГ*ГІГј
  return root->key;//ГўГҐГ°Г*ГїГҐГ¬ ГІГ® Г·ГІГ® ГІГіГ¤Г* Г§Г*ГІГҐГ±Г*ëîñü
}
 
uzel* del_tree(uzel *root, int val)//ГіГ¤Г*ëåГ*ГЁГҐ
{
  if (root==0) return 0;//åñëè 0 ГІГ*ГЄ 0
  if (root->key == val) //åñëè Г*Г*øëè ГІГ®
  {
        //ГЅГІГ® ýëåìåГ*ГІ-ëèñò
     if (root->left==0 && root->right==0) 
     {
      delete root;//äîñòГ*òî÷Г*Г® ïðîñòî ГіГ¤Г*ëèòü
      return 0;
     }
     if (root->right==0 && root->left != 0)//åñëè ГҐГ±ГІГј îäèГ* ïîòîìîê ëåâûé 
     {
      uzel *temp = root->left;//ГІГ® ïåðåìåГ*Г*îé ГІГЁГЇГ* "óçåë" Г§Г*ГЇГЁГёГҐГ¬ Г§Г*Г*Г·ГҐГ*ГЁГҐ óçëГ*-ïîòîìêГ* ñëåâГ*
      delete root;
      return temp;
     }
     if (root->left==0 && root->right != 0) //ГІГ® æå äëÿ ГЇГ°Г*âîãî
     {
      uzel *temp = root->right;
      delete root;
      return temp;
     }
     root->key = rightmost(root->left);//òåïåðü Гў ГіГ¤Г*ëÿåìîé ïîçèöèè áóäåò ñòîÿòü ýëåìåГ*ГІ Г±Г*ìûé ГЇГ°Г*âûé ëåâîãî ïîääåðåâГ*
     root->left = del_tree(root->left, root->key);//ГЁГ№ГҐГ¬ Гў ëåâîì ïîääåðåâå ýëåìåГ*ГІ Г± ГіГ¤Г*ëÿåìûì Г§Г*Г*Г·ГҐГ*ГЁГҐГ¬ ГЁ ïðîâîäèì ГҐГЈГ® äåçèГ*ГІГҐГЈГ°Г*öèþ
     return root;
  }
  if (val < root->key)//åñëè Г§Г*Г*Г·ГҐГ*ГЁГҐ ìåГ*ГјГёГҐ òîãî Г·ГІГ® Гў êîðГ*ГҐ ГІГ® âûïîëГ*ГЁГІГј ГўГ±ГҐ Г*åîáõîäèìûå îïåðГ*öèÿ äëÿ ëåâîãî ïîääåðåâГ* 
  {
   root->left = del_tree(root->left, val);
   return root;
  }
  if (val > root->key)//ГІГ® æå äëÿ ГЇГ°Г*âîãî 
  { 
   root->right = del_tree(root->right, val);
   return root;
  }
 return root;
}
придерживался правила что при удалении корня новым корнем станет самый правый узел левого поддерева.
или же надо проводить проверку на наличие левого поддерева?

Добавлено через 11 часов 16 минут
ошибка найдена.терь работает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru