Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2020, 13:37   #1
Saplai
Новичок
Джуниор
 
Регистрация: 23.03.2020
Сообщений: 1
Восклицание Удалить четные элементы АВЛ-дерева

Я хотел спросить, как удалить четные числа в дереве AVL. У меня есть эта функция, но она не работает как надо. Прошу вашей помощи, буду искренне благодарен. Извините, я просто не опытный программист, поэтому недавно начал изучать структуру данных. Для меня ваш ответ будет очень важен.

Код:

Код:
#include<iostream>
#include<cstdio>
#include<sstream>
#include<algorithm>
#define pow2(n) (1 << (n))
using namespace std;
struct avl {
   int d;
   struct avl *l;
   struct avl *r;
}*r;
class avl_tree {
   public:
      int height(avl *);
      int size(avl*);
      int difference(avl *);
      avl *rr_rotat(avl *);
      avl *ll_rotat(avl *);
      avl *lr_rotat(avl*);
      avl *rl_rotat(avl *);
      avl * balance(avl *);
      avl * insert(avl*, int);
      avl * del(avl*, int);
      avl * min(avl *);
      void show(avl*, int);
      void inorder(avl *);
      void preorder(avl *);
      void postorder(avl*);
      avl_tree() {
         r = NULL;
      }
};
int avl_tree::height(avl* t) {
   int h = 0;
   if (t != NULL) {
      int l_height = height(t->l);
      int r_height = height(t->r);
      int max_height = max(l_height, r_height);
      h = max_height + 1;
   }
   return h;
}
int avl_tree::size(avl *t)  
{  
    if (t == NULL)  
        return 0;  
    else
        return(size(t->l) + 1 + size(t->r));  
}
int avl_tree::difference(avl *t) {
   int l_height = height(t->l);
   int r_height = height(t->r);
   int b_factor = l_height - r_height;
   return b_factor;
}
avl *avl_tree::rr_rotat(avl *parent) {
   avl *t;
   t = parent->r;
   parent->r = t->l;
   t->l = parent;
   cout<<"Right-Right Rotation";
   return t;
}
avl *avl_tree::ll_rotat(avl *parent) {
   avl *t;
   t = parent->l;
   parent->l = t->r;
   t->r = parent;
   cout<<"Left-Left Rotation";
   return t;
}
avl *avl_tree::lr_rotat(avl *parent) {
   avl *t;
   t = parent->l;
   parent->l = rr_rotat(t);
   cout<<"Left-Right Rotation";
   return ll_rotat(parent);
}
avl *avl_tree::rl_rotat(avl *parent) {
   avl *t;
   t = parent->r;
   parent->r = ll_rotat(t);
   cout<<"Right-Left Rotation";
   return rr_rotat(parent);
}
avl *avl_tree::balance(avl *t) {
   int bal_factor = difference(t);
   if (bal_factor > 1) {
      if (difference(t->l) > 0)
         t = ll_rotat(t);
      else
         t = lr_rotat(t);
   } else if (bal_factor < -1) {
      if (difference(t->r) > 0)
         t = rl_rotat(t);
      else
         t = rr_rotat(t);
   }
   return t;
}
avl *avl_tree::insert(avl *r, int v) {
   if (r == NULL) {
      r = new avl;
      r->d = v;
      r->l = NULL;
      r->r = NULL;
      return r;
   } else if (v< r->d) {
      r->l = insert(r->l, v);
      r = balance(r);
   } else if (v >= r->d) {
      r->r = insert(r->r, v);
      r = balance(r);
   } return r;
}
void avl_tree::show(avl *p, int l) {
   int i;
   if (p != NULL) {
      show(p->r, l+ 1);
      cout<<" ";
      if (p == r)
         cout << "Root -> ";
      for (i = 0; i < l&& p != r; i++)
         cout << " ";
         cout << p->d;
         show(p->l, l + 1);
   }
}
void avl_tree::inorder(avl *t) {
   if (t == NULL)
      return;
      inorder(t->l);
      cout << t->d << " ";
      inorder(t->r);
}
void avl_tree::preorder(avl *t) {
   if (t == NULL)
      return;
      cout << t->d << " ";
      preorder(t->l);
      preorder(t->r);
}
void avl_tree::postorder(avl *t) {
   if (t == NULL)
      return;
      postorder(t ->l);
      postorder(t ->r);
      cout << t->d << " ";
}
avl *avl_tree::min(avl* node) { //Вспомогательная функция для del()
    avl* current = node;
    while (current->l != NULL)
        current = current->l;
    return current;
}
avl *avl_tree::del(avl *root, int key) {
   if (root == NULL) {
        return root;
    }
    if (key < root->d)
        root->l = del(root->l, key);
    else if (key > root->d)
        root->r = del(root->r, key);
    else {
        if (root->l == NULL) {
            avl* temp = root->r;
            free(root);
            return temp;
        } else if (root->r == NULL) {
            avl* temp = root->l;
            free(root);
            return temp;
        }
        avl* temp = min(root->r);
        root->d = temp->d;
        root->r = del(root->r, temp->d);
    }
    return root;
}
int main() {
   int c, i;
   avl_tree avl;
   while (1) {
      cout << "1.Insert Element into the tree" << endl;
      cout << "2.show Balanced AVL Tree" << endl;
      cout << "3.InOrder traversal" << endl;
      cout << "4.PreOrder traversal" << endl;
      cout << "5.PostOrder traversal" << endl;
      cout << "6.Exit" << endl;
      cout << "7.Size" << endl;
       cout << "8.Delete: " << endl;
      cout << "Enter your Choice: ";
      cin >> c;
      switch (c) {
         case 1:
            cout << "Enter value to be inserted: ";
            cin >> i;
            r = avl.insert(r, i);
         break;
         case 2:
            if (r == NULL) {
               cout << "Tree is Empty" << endl;
               continue;
            }
            cout << "Balanced AVL Tree:" << endl;
            avl.show(r, 1);
            cout<<endl;
         break;
         case 3:
            cout << "Inorder Traversal:" << endl;
            avl.inorder(r);
            cout << endl;
         break;
         case 4:
            cout << "Preorder Traversal:" << endl;
            avl.preorder(r);
            cout << endl;
         break;
         case 5:
            cout << "Postorder Traversal:" << endl;
            avl.postorder(r);
            cout << endl;
         break;
         case 6:
            exit(1);
         break;
          case 7:
            cout << "Size of tree:"<<  avl.size(r) << endl;
            cout << endl;
         break;
         case 8:
          for (int i = 0; i < avl.size(r); i++) {
        if (i % 2 == 0) {
            avl.del(r, i);
	    r = avl.del(r, i);
        }
    }
            cout << endl;
         break;
         default:
            cout << "Wrong Choice" << endl;
      }
   }
   return 0;
}
Saplai вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить все четные строки Weronika* Общие вопросы C/C++ 0 11.10.2016 11:01
Удалить из бинарного дерева отрицательные элементы Pascal Pav163 Помощь студентам 0 04.02.2013 22:25
удалить все четные элементы, кроме первого такого. александр6642 Помощь студентам 1 30.10.2012 11:10
C++ Задача №64. Вывести четные элементы GAS1989 Помощь студентам 3 02.08.2012 00:19
Задачка про массив - Из массива удалить четные элементы, стоящие после максимального Crookers Общие вопросы C/C++ 4 23.09.2008 19:35