Académique Documents
Professionnel Documents
Culture Documents
rboles
rboles
rboles binarios
Recorridos
rboles binarios de bsqueda
Insercin y borrado en los ABB
Consideraciones finales
Motivacin
Mymail es una nueva compaa que ofrece cuentas de
correo electrnico a sus usuarios. Al cabo de varias semanas
ya cuenta con miles de usuarios, y a este ritmo se esperan
que sean millones. Cmo manejamos dicha cuentas de
modo eficiente?
...
maripili@
piluca@
mymail.com mymail.com
lucasin@
josefo@
mymail.com mymail.com
nachete@
mymail.com
...
Motivacin
Definiciones
Un rbol es una jerarqua de nodos enlazados que
cumple:
Definiciones
A es el nodo raz
H es una hoja
altura
hoja
Definiciones
altura
Aplicaciones
Los
rboles
son
una
estructura
de
datos
extremadamente verstil que permite representar:
Genealogas u organigramas,
Circuitos elctricos,
(a+b)*(c-d)
rboles binarios
Ejemplo:
G
D
subrbol izquierdo
T
K
subrbol derecho
A
Leccin 10: rboles
L
U
izq
dato der
...
...
template
template <class
<class T>
T>
class
Abb
{
class Abb {
Nodo<T>
Nodo<T> *raiz;
*raiz;
public:
public:
Abb();
Abb();
...
...
};
};
Recorridos de rboles
T
K
Leccin 10: rboles
10
Recorridos: preorden
En Preorden el orden de visita es:
1. Nodo raz
2. Nodo izquierda (recursivo)
T
K
R
V
L
U
template
template <class
<class T>
T>
void
void Abb<T>::preorden
Abb<T>::preorden (Nodo<T>
(Nodo<T> *p,
*p, int
int nivel){
nivel){
if
if (p){
(p){
//
// Sustituir
Sustituir por
por procesamiento
procesamiento ----cout
cout <<
<< "Procesando
"Procesando nodo
nodo "<<
"<< p->dato
p->dato ;;
cout
W
cout <<
<< "en
"en el
el nivel
nivel "" <<
<< nivel
nivel <<
<< endl;
endl;
//
// --------------------preorden
preorden (p->izq,
(p->izq, nivel+1);
nivel+1);
preorden
preorden (p->der,
(p->der, nivel+1);
nivel+1);
}}
}}
MHDAGKLTRVUW
11
Recorridos: inorden
En Inorden orden de visita es:
T
K
R
V
L
U
template
template <class
<class T>
T>
void
Abb<T>::inorden
void Abb<T>::inorden (Nodo<T>
(Nodo<T> *p,
*p, int
int nivel){
nivel){
if
(p){
if (p){
inorden
inorden (p->izq,
(p->izq, nivel+1);
nivel+1);
//
Sustituir
por
procesamiento
// Sustituir por procesamiento ------W
cout
<<
"Procesando
nodo
"
<<
p->dato;
cout << "Procesando nodo " << p->dato;
cout
cout <<
<< "en
"en el
el nivel
nivel "" <<
<< nivel
nivel <<
<< endl;
endl;
//
----------// ----------inorden
inorden (p->der,
(p->der, nivel+1);
nivel+1);
}}
}}
ADGHKLMRUVTW
12
Recorridos: postorden
En Inorden el orden de visita es:
3. Nodo raz
M
H
D
A
T
K
R
V
L
U
template
template <class
<class T>
T>
void
Abb<T>::postorden
void Abb<T>::postorden (Nodo<T>
(Nodo<T> *p,
*p, int
int nivel){
nivel){
if
(p){
if (p){
postorden
postorden (p->izq,
(p->izq, nivel+1);
nivel+1);
postorden
(p->der,
nivel+1);
W
postorden (p->der, nivel+1);
//
// Sustituir
Sustituir por
por procesamiento
procesamiento ------cout
<<
"Procesando
nodo
"<<
p->dato;
cout << "Procesando nodo "<< p->dato;
cout
cout <<
<< "en
"en el
el nivel
nivel "" <<
<< nivel
nivel <<
<< endl;
endl;
//
----------// ----------}}
}}
13
Recorridos
realizar
los
template
template <class
<class T>
T>
class
Abb
{
class Abb {
Nodo<T>
Nodo<T> *raiz;
*raiz;
void
preorden(Nodo<T>
void preorden(Nodo<T> *p,
*p, int
int nivel);
nivel);
void
inorden(Nodo<T>
*p,
int
nivel);
void inorden(Nodo<T> *p, int nivel);
void
void postorden(Nodo<T>
postorden(Nodo<T> *p,
*p, int
int nivel);
nivel);
public:
public:
Abb(void);
Abb(void);
void
void recorrePreorden()
recorrePreorden() {{ preorden(raiz,0);
preorden(raiz,0); }}
void
void recorreInorden()
recorreInorden() {{ inorden(raiz,0);
inorden(raiz,0); }}
void
void recorrePostorden()
recorrePostorden() {{ postorden(raiz,0);
postorden(raiz,0); }}
}}
Leccin 10: rboles
14
5
2
19
9
16
20
18
11
17
15
19
9
16
20
18
11
17
Buscamos el 17:
17 > 15 derecha
17 < 19 izquierda
17 > 16 derecha
17 < 18 izquierda
17 == 17 encontrado
16
Funcin pblica
17
Insertar en un ABB
15
15
8
5
2
19
9
16
20
18
11
16
6
5
2
17
18
9
8
11
20
17
19
18
Insertar en un ABB
Este cdigo asume que no se repiten claves
template
template <class
<class T>
T>
Nodo<T>
*Abb<T>::insertaDato(T
Nodo<T> *Abb<T>::insertaDato(T &ele,
&ele, Nodo<T>*
Nodo<T>* &p){
&p){
if
(!p){
if (!p){
pp == new
new Nodo<T>(ele);
Nodo<T>(ele);
}} else
{
else {
if
if (ele
(ele <=
<= p->dato)
p->dato)
p->izq
=
p->izq = insertaDato(ele,
insertaDato(ele, p->izq);
p->izq);
else
Funcin privada
else
p->der
=
insertaDato(ele,
p->der);
p->der = insertaDato(ele, p->der);
}}
return
return p;
p;
}}
template
template <class
<class T>
T>
bool
Abb<T>::insertar(T
bool Abb<T>::insertar(T &ele){
&ele){
bool
encontrado
=
buscar(ele);
bool encontrado = buscar(ele);
if
if (!encontrado){
(!encontrado){
insertaDato(ele,
insertaDato(ele, raiz);
raiz);
return
true;
return true;
}}
return
return false;
false;
}}
Leccin 10: rboles
Funcin pblica
19
15
8
5
19
19
9
6
6
5
16
5
18
9
17
20
17
20
20
19
9
Colocamos 20
15
16
Borrar 19
5
21
20
22
20
9
16
21
20
22
Se elimina el nodo 20
Leccin 10: rboles
21
menor=result
Leccin 10: rboles
20
22
23
22
23
Consideraciones finales
Los ABB mejoran el tiempo de bsqueda pero:
12
12
12
3
7
12
(a)
(b)
(c)
(d)
24
Consideraciones finales
La solucin a estos problemas pasa por conseguir que
el rbol permanezca equilibrado tras las inserciones y
borrados
6
5
22
20
23
9
27
17
17
equilibrado
6
5
23
15
20
25
27
25