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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2014, 17:15   #1
nxexox
Новичок
Джуниор
 
Регистрация: 18.05.2014
Сообщений: 2
По умолчанию Бин деревья(С++)

Здравствуйте программисты! Учусь на первом курсе. Возникли проблемы с разработкой функции удаления элемента из дерева. Т.е. удаление из дерева по ключу любого элемента. код не работает. три дня сижу запарился с ней. Помогите пожалуйста
вот код:
Код:
#include <iostream>
using namespace std;
 
 
struct Node   
 { int d;
   Node *l; 
   Node *r; 
 };
void add(Node*& p, int d);
void print( Node* p, int level=1 );
void del(Node* p,int key);
Node* firstpr(Node* p,int key);
Node* first(Node* p,int key);
 
void main()
{ Node* p, pv;
  int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
  p = NULL;
  //cout <<"vvedite 4isla ";
  for(int i=0;i<8;i++) add(p,b[i]);
  cout<<endl;
   print( p );
   cout <<"\n\n"; 
  del(p,1);
  print(p);
  system([COLOR="rgb(139, 0, 0)"]"pause"[/COLOR]);
}
 
void add(Node*& p, int d) 
 
{ if (p == NULL)  
   { p = new Node; p->l = NULL; p->r = NULL; p->d = d; }
   else             
    { if (d >= p->d) add(p->r, d);  
      if (d <  p->d) add(p->l, d);   
    }
}
 
void print( Node* p, int level ) 
{ int tab = 5; 
 
  if (p == NULL) cout <<"Derevo pusto \n";
   else
    { if (p->r != NULL) print(p->r, level+1);
                
      cout.width(tab*level);
      cout<<p->d <<endl;
      if (p->l != NULL) print(p->l, level+1);
    }
}
 
Node* firstpr(Node* p,int key)
{
    if(p->l->d==key) return p;
    if(p->r->d==key) return p;
    if(key<p->d) firstpr(p->l,key);
    if(key>p->d) firstpr(p->r,key);
}
Node* first(Node* p,int key)
{
    Node* pv=firstpr(p,key);
    if(pv->l->d==key) return pv->l;
    if(pv->r->d==key) return pv->r;
}
 
void del(Node* p,int key)
{
    Node* pd1;
    Node* pr=firstpr(p,key);
    Node* pd=first(p,key);
    if((pd->r==NULL)&&(pd->l==NULL))
    {
        if(pr->r==pd) pr->r=NULL;
        else if(pr->l==pd) pr->l=NULL;
        delete pd;
    }
    /*else if(pd->l==NULL)
    {
        
        if(pr->r==pd)pr->r=pd->r;
        if(pr->l==pd)pr->l=pd->r;
        pd->r=NULL;
        delete pd;
    }
    else if(pd->r==NULL)
    {
        
        if(pr->r==pd)pr->r=pd->l;
        if(pr->l==pd)pr->l=pd->l;
        pd->l=NULL;
        delete pd;
    }*/
    /*else
    {
        if(pd->r->l==NULL)
        {
            if(pr->r=pd)pr->r=pd->r;
            if(pr->l=pd)pr->l=pd->r;
            pd->r=NULL;
            delete pd;
        }
        else
        {
            pd1=pd;
            pd1=pd1->r;
            while(pd1->l->l=NULL) pd1=pd1->l;
            pd1->l->l=pd->l;
 
        }
    }*/
 
 
}

Последний раз редактировалось nxexox; 18.05.2014 в 17:27.
nxexox вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бин. поиск Делфи 7, вопросик Андрос Помощь студентам 0 23.05.2013 19:17
Деревья Си++ СветОК Общие вопросы C/C++ 1 25.05.2012 07:52
Деревья Си++ СветОК Помощь студентам 0 24.05.2012 20:56
Вопрос(бин.дерево) mike_tihomirov Общие вопросы C/C++ 5 05.07.2010 14:33
Рекурсивная суммация цисел в узлах Бин.Дерева интеграл Помощь студентам 0 11.05.2010 10:09