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

бинарное древо (удаление) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ STL обращение к элементу list http://www.cyberforum.ru/cpp-beginners/thread43094.html
Помогите исправить ошибку. #include <list> #include <iostream> using namespace std; class PeopleB{ public: int xxx; }; const int EnKolB=4; int main(){
C++ Для чего нужен define? Для чего нужен оператор define? например код #define N 20 /* сколько первых чисел посчитать */ void main(){ int fibs, index; http://www.cyberforum.ru/cpp-beginners/thread43051.html
Работа со строками. Связное хранение строк. C++
Постановка задачи В текстовом файле хранится последовательность слов. Предполагается, что слово содержит не более 20 букв, слова отделяются друг от друга одним или бо-лее пробелами, количество слов в файле не ограничено. Требуется: 1. Прочитать исходный текст из файла и поместить его в памяти, использовать однонаправленные циклические цепочки . Каждое звено текста размещается в памяти...
Нужно исправить 2 ошибки в коде C++
собственно, САБЖ. нужно исправить 2 ошибки в коде, чтобы его можна было скомпилить и сделать из него ехе-шник. код немалый, тому залил на sendspace: http://sendspace.com/file/ubkkh6 времени немного - до утра понедельника..выручайте, народ, пожалуйста
C++ Вывод случайных текстов на экран http://www.cyberforum.ru/cpp-beginners/thread42999.html
помогите пожалуйста, мне нужен код для случайных выводов текстов на экран
C++ обход массива рендом. Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а что нет? подробнее

Показать сообщение отдельно
Alexen
5 / 5 / 0
Регистрация: 14.11.2008
Сообщений: 77

бинарное древо (удаление) - C++

06.07.2009, 00:36. Просмотров 966. Ответов 8
Метки (Все метки)

Ребята выручайте не как не могу понять алгоритм удаления из дерева. Кто нить может описать подробные коментарии к удалению узла у которого есть оба поддерева
или в нем где есть ошибка.
Зарание спс.
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
struct tree *dtree(struct tree *root, char key)
{
  struct tree *p,*p2;
 
  if(!root) return root; /* вершина не найдена */
 
  if(root->info == key) { /* удаление корня */   ЭТО ПОНЯТНО
    /* это означает пустое дерево */
    if(root->left == root->right){
      free(root);
      return NULL;
    }
    /* или если одно из поддеревьев пустое */
    else if(root->left == NULL) {
      p = root->right;     ЧТО ДАЛЬШЕ С p ДЕЛАТЬ ПОСЛЕ СОХРАНЕНИЯ ???
      free(root);
      return p;
    }
    else if(root->right == NULL) {
      p = root->left;  [B]ЧТО ДАЛЬШЕ С p ДЕЛАТЬ ПОСЛЕ СОХРАНЕНИЯ ???[/B]
      free(root);        Этот же указатель надо записать в один из указателей  отца        или  я  ошибаюсь чтоб исключить root и сохранить левое поддерево.[/B]
      return p;       
    }                             
    /* или есть оба поддерева */
    else {
      p2 = root->right;  [B]ТУТ плз ПОДРОБНЫЕ КОМЕНТЫ ОСТАВЬТЕ.[/B]
      p = root->right;
      while(p->left) p = p->left;
      p->left = root->left;
      free(root);
      return p2;
    }
  }
  if(root->info < key) root->right = dtree(root->right, key);
  else root->left = dtree(root->left, key);
  return root;
}
Добавлено через 2 часа 15 минут 4 секунды
Я сделал удаление если у узла 2 поддерева. Оцените это будет гуд??
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
else
  {
    Date<X> *temp = Head, *Old;
     while(temp)
      {
        if(temp->date < value)
         {Old = temp; temp = temp->Right;}
      else
        if(temp->date > value)
         {Old = temp; temp = temp->Left;}
      else
         {
            Date<X> *Ptr = temp->Right;
            while(Ptr->Left)
             {Ptr = Ptr->Left;}
 
            Ptr->Left = temp->Left;
            if(Old->date > value)
             Old->Left = Ptr;
            else
             Old->Right = Ptr;
            delete temp; return;
         }
 
        }
     }
Добавлено через 6 минут 55 секунд
Остались непонятки с одиночными подеревьями. То есть если
C++
1
2
3
4
5
6
7
8
else if(root->left == NULL) {
      p = root->right;     
      free(root);
Во всех случаях делается такая проверка если поддерво одно??
if(root->date > value)
    Old->Left = p;
else
          Old->Right = p;
Добавлено через 18 минут 24 секунды
Я сделал ребята гляньте ПЛЗ кто понимает правильно ли это будет и может где лишние условия есть. Учимся на ошибках.
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
template<class X>
void Free<X>::del_free(X &value)
{
 
  if(!Head)
  {cout << "Дерево пустое." << endl; return;}
else
  if(Head && (Head->Left == Head->Right))
    {delete Head;}
 
  else
  {
    Date<X> *temp = Head, *Old;
     while(temp)
      {
 
        if(temp->date < value)
         {Old = temp; temp = temp->Right;}
      else
        if(temp->date > value)
         {Old = temp; temp = temp->Left;}
      else
         {
         Date<X> *Ptr2 = temp->Right, *Ptr1;
 
          if(!temp->Left)
            {
              Ptr1 = temp->Right; delete temp;
              if(Old->date < value)
              Old->Left = Ptr1;
              else
              Old->Right = Ptr1;
              return;
            }
         else
            if(!temp->Right)
            {
             Ptr1 = temp->Left; delete temp;
              if(Old->date < value)
              Old->Left = Ptr1;
              else
              Old->Right = Ptr1;
              return;
 
            }
         else
          {
            while(Ptr2->Left)
             {Ptr2 = Ptr2->Left;}
 
            Ptr2->Left = temp->Left;
            if(Old->date > value)
             Old->Left = Ptr2;
            else
             Old->Right = Ptr2;
            delete temp; return;
          }
          }
 
        }
     }
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru