Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Implementare in C++:
#include<stdio.h>
#include<iostream.h>
typedef struct arbore
{
int rosu;
int negru;
struct nod;
}
nod *st,*dr,*parinte;
void rotire_st( arbore T; nod x ) /* procedura de rotatie la stanga
transforma configuratia celor doua noduri prin schimbarea unui
numar constant de pointeri */
{
nod y;
y = x->dr; /* setam y */
/* Intoarecem stanga lui y in dreapta lui x */
x->dr = y->st;
if ( y->st != NULL )
y->st->parinte = x;
/* parintele nou a lui y a fost parintele lui x */
y->parinte = x->parinte;
/* Setam parinte lui y in locul lui x */
/* Prima data vedem dak suntem in radacina */
if ( x->parinte == NULL ) T->radacina = y;
else
if ( x == (x->parinte)->st )
/* x a fost in stanga parintilor */
x->parinte->st = y;
else
/* x trebuia sa fie in dreapta */
x->parinte->dr = y;
/* In final, punem pe x in stanga lui y*/
y->st = x;
x->parinte = y;
}
void rb_insereaza( arbore T, nod x ) /* putem insera un nod intrun arbore rosu-negru in O(lg n) timp. Pentru aceasta trebuie sa
folosim o versiune putin modificata a functiei de inserare in
arbore */
{
/* Se inseara in arbore normal */
arbore_insereaza( T, x );
/* Acum returnam proprietataea rosu si negru */
x->culoare = rosu;
/* urmatoarea parte de cod e necesara deoarece in urma procedurii
de inserare se poate ca radacina sa nu mai fie neagra (regula 2)
sau ca un nod rosu sa aiba fii de acceasi culoare (regula 4) */
while ( (x != T->radacina) && (x->parinte->culoare == rosu) ) {
if ( x->parinte == x->parinte->parinte->st ) {