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

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

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

Показать сообщение отдельно
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
13.12.2010, 13:33     Удаление узла из дерева
сделав функции добавления,поиска,пару обходов и вывод ввиде дерева в консоли(жаль что нельзя размер по 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 минут
ошибка найдена.терь работает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru