Forum Dyskusyjne
Zaloguj Rejestracja Szukaj Forum dyskusyjne

Forum dyskusyjne -> Software -> Programowanie :: WWW -> algorytm równoważenia drzew binarnych [C]
Napisz nowy temat  Odpowiedz do tematu
algorytm równoważenia drzew binarnych [C]
PostWysłano: Wtorek, 25 Maj 2004, 10:35 Odpowiedz bez cytowania Odpowiedz z cytatem
am
Czytelnik
<tt>Czytelnik</tt>
 
Użytkownik #988
Posty: 1


[ Osobista Galeria ]




Szukam algorytmu równoważenia drzew binarnych w c.
  
Re: algorytm równoważenia drzew binarnych [C]
PostWysłano: Środa, 26 Maj 2004, 01:00 Odpowiedz bez cytowania Odpowiedz z cytatem
Tassadar
Kapitan Heh
 
Użytkownik #3
Posty: 246


[ Osobista Galeria ]




jest ich pare..
dobre to AVL i RB.
http://www.seanet.com/users/arsen/avltree.html

kod dla AVL:
Kod:
/*zwraca wielkosc poddrzewa o korzeniu x*/
int pod(EL *x){
  if(x)
    return x->pod;
  return 0;
}
/*zwraca element wieszky*/
int max(int a,int b){
  if(a>b)
    return a;
  return b;
}
/*rotacja w lewo wzgledem x*/
void ll(EL *x){
  if(!x->p)
    root=x->r;
  else if(x==x->p->l)
    x->p->l=x->r;
  else
    x->p->r=x->r;
  x->r->p=x->p;
  x->p=x->r;
  x->r=x->p->l;
  if(x->r)
    x->r->p=x;
  x->p->l=x;
  /*aktualizacja wysokosci poddrzew*/
  x->pod=max(pod(x->l),pod(x->r))+1;
  x=x->p;
  x->pod=max(pod(x->l),pod(x->r))+1;
}
/*rotacja w lewo wzgledem x*/
void rr(EL *x){
  if(!x->p)
    root=x->l;
  else if(x==x->p->l)
    x->p->l=x->l;
  else
    x->p->r=x->l;
  x->l->p=x->p;
  x->p=x->l;
  x->l=x->p->r;
  if(x->l)
    x->l->p=x;
  x->p->r=x;
  /*aktualizacja wysokosci poddrzew*/
  x->pod=max(pod(x->l),pod(x->r))+1;
  x=x->p;
  x->pod=max(pod(x->l),pod(x->r))+1;
}
/*przywraca wlasnosc AVL od x-a w gore*/
void update(EL *x){
  int temp;
  do{
    temp=x->pod;
    switch(pod(x->l)-pod(x->r)){ /*roznica wysokosci*/
    case 2:
      if(pod(x->l->l)-pod(x->l->r)==-1)
        ll(x->l);
      rr(x);
      x=x->p;
      break;
    case -2:
      if(pod(x->r->l)-pod(x->r->r)==1)
        rr(x->r);
      ll(x);
      x=x->p;
      break;
    default:
      x->pod=max(pod(x->l),pod(x->r))+1;
    }
  }
  while(x=x->p);
}

struktura elementow:
Kod:
element->l  <=> lewy potomek
element->r  <=> prawy potomek
element->l  <=> rodzic
element->pod  <=> wielkosc poddrzewa - specyficzne dla AVL - musisz dodac

korzen musi byc zdefiniowany globalnie, charakteryzuje sie tym ze jego rodzic jest NULL.
jesli element nie ma danego potomka to wskaznik na niego to tez NULL.
oczywiscie wszystkie nazwy mozesz pozmieniac.

po dodaniu lub usunieciu czegos z drzewa trzeba je zrownowazyc wywolujac update(x), gdzie x to element dodawany lub rodzic elementu usuwanego (tego ktorego pamiec zwalniamy), jesli taki istnieje.
Kod, ktory mam u siebie jest lepszy - troche szybszy, ale moze ci przysporzyc dodatkowych problemow w stosunku do tego wiec nie podaje.
  
algorytm równoważenia drzew binarnych [C]
Forum dyskusyjne -> Software -> Programowanie :: WWW

Strona 1 z 1  
  
  
 Napisz nowy temat  Odpowiedz do tematu  
Kopiowanie i rozpowszechnianie materiałów w całości lub części jest niedozwolone. Wszelkie informacje zawarte w tym miejscu są chronione prawem autorskim.



Forum dyskusyjne Heh.pl © 2002-2010