Professional Documents
Culture Documents
rboles
Ejemplos de estructuras arborescentes: con forma de rbol
un elemento de tipo
ms un nmero de rboles de
Ejemplo:
(rbol no vaco)
o
o
Pero: Todo rbol finitario puede representarse como un rbol binario, segn mtodo a
ver ms tarde.
Recurrencia primitiva:
f : AB X
f (()) = xo
Ejemplos:
o Tamao:
Cantidad de nodos
t : N para cada rbol binario t.
- : AB N
() : 0
(izq, a, der) = 1 + izq + der
o
Profundidad:
Antes: niveles de un
rbol
(Usando la analoga con rboles genealgicos, nivel =
generacin)
Profundidad de un rbol = cantidad de niveles que tiene
= cantidad de nodos en el camino ms largo de la raz a una hoja.
La profundidad del rbol binario vaco es 0.
En general, son procedimientos que visitan todos los nodos de un rbol binario
efectuando cierta accin sobre cada uno de ellos.
La forma de estos procedimientos depende del orden que se elija para visitar los
nodos.
Obviamente, recorrer un rbol vaco es trivial. Para recorrer un rbol no vaco:
hay tres rdenes naturales, segn la raz sea visitada antes que los subrboles,
entre las recorridas de los subrboles o despus de recorrer los subrboles.
Primer orden:
Pre orden
se visita la raz;
se recorre el subrbol izquierdo;
Segundo orden:
Recorrida e orden
Orden simtrico
Tercer orden
Post-orden
Ejemplo: formar la lista de los elementos de un rbol binario que se obtiene por
recorrerlo en orden (linealizacin, secuenciamiento, listado):
en-orden ( ) = [ ]
en-orden (izq, a, der) = en-orden (izq)
++ (a. enorden (der) )
( concatenacin de listas)
= en-orden (izq)
++ [a] ++ enorden (der).
Definicin inductiva:
un rbol binario ordenado (de naturales) es:
o
o
o bien vaco
o bien consta de un natural n y dos rboles binarios ordenados, izq
y der, tales que todo elemento de izq es menor que n y todo
elemento de der es mayor que n.
Definimos entonces:
typedef ABNodo* AB;
typedef struct ABNodo{
int elem;
AB izq, der;
};
Suponemos aqu que P acta slo sobre los elementos (informacin en los nodos) y no
sobre los punteros (estructura del rbol).
Dejamos abierta la posibilidad de una accin final, a realizar para cada subrbol vaco.
Cmo se escriben algoritmos iterativos sobre rboles?
(*)Cada nuevo subrbol derecho que aparece debe ser recorrido antes que los
aparecidos anteriormente
Por lo tanto: podemos apilar los punteros a los subrboles pendientes.
Dicho de otra forma: estructuramos los punteros a subrboles pendientes en una pila.
El tope ser el primer subrbol pendiente a recorrer. Debido a la observacin marcada
(*) arriba, cada nuevo subrbol derecho que aparezca deber ser colocado como nuevo
tope de la pila.
Con esta idea puede completarse la versin iterativa del algoritmo de recorrida
en pre-orden. (Ejercicio).
Se concluye que, en general, la programacin iterativa de algoritmos en rboles
es MUCHO ms compleja que la recurrente.
Dado que los programas iterativos son en general ms eficientes, se hace
interesante estudiar mtodos de transformacin de algoritmos recurrentes en
iterativos equivalentes.
Si estos mtodos pueden ser automatizados, entonces pueden ser aplicados directamente
por un compilador. En tal caso, podemos construir programas simples (recurrentes) sin
tener que preocuparnos por la prdida de eficiencia.
(Los algoritmos recurrentes sobre rboles son de mayor nivel de abstraccin que los
iterativos).
Insercin en un rbol binario ordenado:
void ABOIns (int x, AB &t){
}
Notar que se inserta siempre una nueva hoja:
Ej: dado
o bien es vaco
o consiste de un elemento de T (llamado raz) y dos rboles binarios de tipo T
disjuntos llamados subrbol izquierdo y derecho de la raz
Aplicacin
Escribir un procedimiento que dado un rbol binario retorna el nmero de nodos que
contiene.
Especificacin
Nodos ( Vacio() ) = 0
Nodos ( CreoAb(r, i, d) ) = 1 + Nodos(i) + Nodos(d)
Implementacin
int CatnNodos ( AB ab ){
/* retorna el nmero de nodos de ab */
//Declaracin de variables
int n;
if (Vacio(ab))
num = 0;
else{
num = 1 + Nodos(SubArbIzq(ab)) +
Nodos(SubArbDer(ab));
struct NodoAB {
T raiz;
AB izq;
AB der;
};
AB Vacio (){
return NULL;
}
AB CreoAB ( T r, AB i , AB d) {
AB Temp ;
Temp=new NodoAB;
Temp->raiz = r;
Temp->izq= i;
Temp->der = d;
return Temp;
}
boolean EsVacio (AB ab) {
Si un rbol est organizado de forma tal que para cada nodo ni, todas las claves
en el subrbol izquierdo de ni son menores que la clave de ni, y todas las claves
en el subrbol derecho de ni son mayores que la clave de ni, entonces este rbol
es un ABB.
Los valores en los nodos de un ABB pueden ser nmeros, caracteres, o
estructuras complejas. Lo importante es que haya un orden total definido sobre
el conjunto de los valores.
if (EsVacio(SubArbIzq(ab)))
return Raiz(ab);
else
return Minimo(SubArbIzq(ab));
}//fin Mnimo;
En forma similar podemos definir un procedimiento para localizar el mximo elemento
de un ABB:
Borrar un elemento
Esta operacin, dada una clave i y un ABB, retorna otro ABB del que se ha borrado el
item con clave i (si existe).
Solucin:
Si el item a borrar se encuentra en la raz del rbol, primero hay dos simples
casos:
1. si el subrbol izquierdo es vaco entonces devolvemos el subrbol
derecho
2. el caso dual
Si ninguno de los subrboles es vaco,entonces debemos encontrar un elemento
con el cual reemplazar el item a borrar, preservando adems la propiedad de
ABB del rbol.
Dos posibles candidatos:
1. el elemento mayor del subrbol izquierdo
2. el elemento menor del subrbol derecho.