С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Удаление узла из дерева - 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). В каждой... http://www.cyberforum.ru/cpp-beginners/thread209691.html
Структура с массивом C++
Доброго времени суток, форумчане! Нужна помощь ) Есть задание: описать структуру с именем train, содержащую поля: - название пункта назначения; - номер поезда; - время отправления; Написать...
Число Фибоначчи C++
Дан одномерный массив А неупорядоченных натуральных чисел.Вывести на экран те элементы массива, которые нельзя представить суммой двух чисел Фибоначчи! помогите пожалуйста!
C++ Определить сможет ли белый слон одним ходом пройти на поле http://www.cyberforum.ru/cpp-beginners/thread209648.html
Поле шахматной доски определяется парой натуральных целых чисел, каждое из которых не превосходит восьми: Первое число номер вертикали при счете слево на право Второе номер горизонтали при счете с...
C++ Двунаправленный список Чемпион мира по футболу. Страна, год последней победы, число побед. Сортировка по названию. Вычисление среднего числа титулов всех чемпионов в списке. 1 . Сформировать структуру типа A .... подробнее

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

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

13.12.2010, 13:33. Просмотров 557. Ответов 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 минут
ошибка найдена.терь работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.