SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
8: Arboles 1
ELO320 Estructuras de Datos y Algoritmos
Arboles Binarios
Tomás Arredondo Vidal
Este material está basado en:
Ì Robert Sedgewick, "Algorithms in C", (third edition), Addison-Wesley, 2001
Ì Thomas Cormen et al, “Algorithms”, (eighth edition), MIT Press, 1992.
Ì material del curso ELO320 del Prof. Leopoldo Silva
Ì material en el sitio http://es.wikipedia.org
8: Arboles 2
8-Árboles Binarios
8.1 Definiciones y tipos de datos
8.2 Cálculos de complejidad
8.3 Operaciones básicas y de recorrido
8.4 Operaciones de consulta
8.5 Operaciones de modificación
8: Arboles 3
Definiciones
Ì Un árbol es una estructura de datos con nodos
enlazados en forma jerárquica y orientada.
r Es una estructura ordenada en que los hijos de un nodo
generalmente tienen un valor menor que este y están
ordenados de izquierda a derecha.
Ì La raíz es el punto de entrada a la estructura.
Ì La raíz puede tener cero o más nodos descendientes
desde ella.
r El conjunto de estos nodos forman subárboles de la raíz.
r La raíz es el ancestro de estos subárboles.
r Los nodos sin descendientes se llaman hojas.
r Los nodos internos son todos los nodos menos las hojas.
8: Arboles 4
Definiciones II
Ì Una trayectoria del nodo ni al nodo nk, es una
secuencia de nodos desde ni hasta nk, tal que ni es el
padre de ni+1.
Ì Existe un solo enlace (link) entre un padre y cada uno
de sus hijos.
Ì El largo de una trayectoria es el número de enlaces en
la trayectoria.
r Una trayectoria de k nodos tiene largo k-1.
Ì La altura de un nodo es el largo de la trayectoria más
larga de ese nodo a una hoja.
Ì La profundidad de un nodo es el largo de la
trayectoria desde la raíz a ese nodo.
r La profundidad del árbol es la profundidad de la hoja mas
profunda.
r Nodos a una misma profundidad están al mismo nivel.
8: Arboles 5
Definiciones III
Ì Árboles binarios
r Cada nodo puede tener un hijo izquierdo y/o un
hijo derecho.
r Un árbol binario está formado por un nodo raíz,
un subárbol izquierdo I y uno derecho D.
• Donde I y D son árboles binarios. Los subárboles se
suelen representar gráficamente como triángulos.
8: Arboles 6
Definiciones IV
Ì Árboles binarios de búsqueda
r Las claves de los nodos del subárbol izquierdo
deben ser menores que la clave de la raíz.
r Las claves de los nodos del subárbol
derecho deben ser mayores que la
clave de la raíz.
r Esta definición no acepta elementos
con claves duplicadas.
r Se indican el descendiente del subárbol izquierdo
con mayor valor de clave y el descendiente del
subárbol derecho con menor valor; los cuales son el
antecesor y sucesor de la raíz.
8: Arboles 7
Tipos de datos
Ì Para un árbol binario hay
que usar dos punteros.
r Se da un ejemplo con una
clave entera, no se muestra
espacio para los otros datos
que puede estar asociada al
nodo.
r En la implementación de
algunas operaciones conviene
disponer de un puntero al
padre del nodo (tampoco se
muestra en este ejemplo).
Ì struct node
{
int clave;
struct node *left;
struct node *right;
};
typedef node * pnode;
8: Arboles 8
8-Árboles Binarios
8.1 Definiciones y tipos de datos
8.2 Cálculos de complejidad
8.3 Operaciones básicas y de recorrido
8.4 Operaciones de consulta
8.5 Operaciones de modificación
8: Arboles 9
Complejidad: árboles completos
Ì Deduciremos, de manera inductiva
la altura de las hojas en función del
número de nodos.
Ì El caso más simple de un árbol
completo tiene tres nodos, un nivel
y altura (A) de dos.
Ì Hemos modificado levemente la
definición de altura, como el
número de nodos que deben ser
revisados desde la raíz a las hojas,
ya que la complejidad de los
algoritmos dependerá de esta
variable.
r A medida que se avanza en la
trayectoria se descarta T(n/2)
nodos en cada avance.
Ì Un árbol perfectamente balanceado
que tiene n nodos internos tiene n+1
hojas.
Ì Árbol de nivel 1.
Nodos = 3 = 22-1
Altura = 2
Ì Árbol de nivel 2.
Nodos = 7 = 23-1
Altura = 3
Ì Árbol de nivel 3.
Nodos = 15 = 24-1
Altura = 4
Ì Árbol de n nodos:
n = 2A-1
A = log2(n+1) = O(log n)
8: Arboles 10
Complejidad: árboles con un nivel de
desbalance
Ì Se ilustran los tres casos de
árboles, de nivel dos, con un nivel
de desbalance, para n = 4, 5 y 6.
Ì En general para n nodos se tiene:
2A-1 ≤ n ≤ 2A-2
A <= (1 + log2(n) ) para la primera
desigualdad y A >= log2 (n +2) para
la segunda.
Ì Cual es la complejidad de A?
Ì Se pueden encontrar constantes
(i.e. c1,c2) que acoten, por arriba
y por abajo a ambas funciones
para n > 10,079:
1*log2 n <=log2 (n+2) <= A <= 1 + log2n
<= 1.3* log2n
A = Θ(log n)
Ì Árboles de nivel 2.
Nodos de 4 a 6
De 23-1 hasta 23-2
Altura = 3
Ì Árboles de nivel 3.
Nodos de 8 a 14
De 24-1 hasta 24-2
Altura = 4
Ì Árbol de nivel m.
Nodos: 2A-1 ≤ n ≤ 2A-2
Altura = A
8: Arboles 11
Complejidad: árboles construidos en
forma aleatoria
Ì Para n nodos, con claves: 1, 2, 3, …, n, se pueden construir n!
árboles. Ya que existen n! permutaciones de n elementos.
Ì El orden de los elementos de la permutación, es el orden en que se
ingresan las claves a partir de un árbol vacío.
Ì Lo que se desea conocer es la altura An, definida como la altura
promedio de las búsquedas de las n claves y promediadas sobre los
n! árboles que se generan a partir de las n! permutaciones que se
pueden generar con la n claves diferentes.
Ì Si el orden de llegada de las claves que se insertan al árbol se
genera en forma aleatoria, la probabilidad de que la primera clave,
que es la raíz, tenga valor i es 1/n.
Ì Esto dado que todas las claves son
igualmente probables.
Ì El subárbol izquierdo contiene (i-1) nodos;
por lo tanto el subárbol derecho contiene (n-i) nodos.
Ì Para este tipo de árbol en promedio el largo
de cualquier trayectoria es: An ≈ 2ln(n) = O(log 2)
8: Arboles 12
Complejidad: árboles construidos en
forma aleatoria (cont)
Ì La gráfica muestra que para árboles de tipo 1000 nodos, deben
recorrerse cerca de nueve nodos desde la raíz hasta las hojas
(peor caso), si está balanceado.
Ì El largo promedio de los recorridos es 12 en un árbol generado
aleatoriamente, y 1000 en peor caso.
Ì Contrastando con un árbol
balanceado para n grande:
An/A≈ 2ln(n)/2log2(n)≈ 1,3
Ì Para n grande en promedio
el alargue es entre un
20 - 39%
8: Arboles 13
8-Árboles Binarios
8.1 Definiciones y tipos de datos
8.2 Cálculos de complejidad
8.3 Operaciones básicas y de recorrido
8.4 Operaciones de consulta
8.5 Operaciones de modificación
8: Arboles 14
Recorridos en árboles
Ì Existen tres modos de recorrido, con
las siguientes definiciones recursivas:
r En orden: Se visita el subárbol
izquierdo en orden; Se visita la raíz; Se
visita el subárbol derecho en orden.
r Pre orden: Se visita la raíz; Se visita el
subárbol izquierdo en preorden; Se
visita el subárbol derecho en preorden.
r Post orden: Se visita el subárbol
izquierdo en postorden; Se visita el
subárbol derecho en postorden; Se
visita la raíz.
Ì Ejemplo: Como se recorreria el árbol
formado con el siguiente conjunto de
claves usando los tres modos?
{ n0, n1, n2, n3, n4, n5}
Ì En orden:
{n1, n3, n4}, n0, {n2, n5}
n3, n1, n4, n0, {n2, n5}
n3, n1, n4, n0, n2, n5
Ì Pre orden:
n0, {n1, n3, n4}, {n2, n5}
n0, n1, n3, n4, {n2, n5}
n0, n1, n3, n4, n2, n5
Ì Post orden:
{n1, n3, n4}, {n2, n5}, n0
n3, n4, n1, {n2, n5}, n0
n3, n4, n1, n5, n2, n0
8: Arboles 15
Recorridos en árboles II
Ì Notación in situ, corresponde a recorrido en orden: I, n0, D
Ì Como seria el arbol? ( a * b) / (c + d)
Ì Como seria un recorrido en post orden (RPN)?
a b * c d + /
Ì Tarea, encontrar expresión in situ para la polaca inversa:
a b c / + d e f * - *
8: Arboles 16
Operaciones básicas: crear nodo
Ì Crear árbol vacío:
pnodo arbol=NULL;
Ì Crea nodo inicializado con un valor:
pnodo CreaNodo(int valor)
{ pnodo pi=NULL;
if ( (pi= (pnodo) malloc(sizeof(nodo))) ==NULL)
return (0);
else
{
pi->clave=valor;
pi->left=NULL;
pi->right=NULL;
}
return(pi);
}
8: Arboles 17
Operaciones básicas: recorrer en orden
void RecorraEnOrden(pnodo p)
{ if (p!= NULL) //si no llegó a hojas y no es árbol vacío.
{
RecorraEnOrden(p->left); // primero recorre el
// subárbol izquierdo.
printf ("%d n", p->clave); // imprime el nodo
RecorraEnOrden(p->right); // recorre subarbol der.
}
}
Ì Si se tiene un árbol de n nodos, y si se asume arbitrariamente que el
subárbol izquierdo tiene k nodos, se puede plantear que la
complejidad temporal del recorrido es: T(n) = T(k) + Θ(1) + T(n-k-1)
8: Arboles 18
Operaciones básicas: recorrer II
Ì Para simplificar el cálculo podemos asumir un árbol balanceado:
T(n) = T(n/2) + Θ(1) + T(n/2 - 1)
Ì Y para grandes valores de n, podemos simplificar aún más:
T(n) = 2*T(n/2) que tiene por solución: T(n) = n = Θ(n)
Ì Otro cálculo es considerar el peor caso para el subárbol derecho:
T(n) = T(1) + Θ(1) + T(n - 2)
Ì La que se puede estudiar como T(n) = T (n -2) + 2 asumiendo
Θ(1)=T(1) = 1, T(2) = 1 que tiene por solución T(n) = n – (1/2)(1+(-1)n).
Ì El segundo término toma valor cero para n par, y menos uno para n
impar.
Ì Puede despreciarse para grandes valores de n, resultando:
T(n) = Θ(n)
8: Arboles 19
Operaciones básicas: recorrer mostrando
nivel
Ì Recorrer en orden mostrando nivel:
void inorder(pnodo t, int nivel)
{
if (t != NULL)
{
inorder(t->left, nivel+1);
printf ("%d %d n", t->clave, nivel);
inorder(t->right, nivel +1);
}
}
Ì Ejemplo de uso:
inorder(arbol, 0); //Imprime considerando raíz de nivel 0.
Ì Mostrar en post-orden y pre-orden son análogos a como se
implemento RecorreEnOrden( ) e inorder( ).
8: Arboles 20
8-Árboles Binarios
8.1 Definiciones y tipos de datos
8.2 Cálculos de complejidad
8.3 Operaciones básicas y de recorrido
8.4 Operaciones de consulta
8.5 Operaciones de modificación
8: Arboles 21
Buscar mínimo
pnodo BuscarMinimoIterativo(pnodo t) {
while ( t != NULL)
{
if ( t->left == NULL )
return (t); //apunta al mínimo.
else
t=t->left; //desciende por la izquierda
}
return (t); /* NULL si árbol vacío*/
}
pnodo BuscaMinimoRec(pnodo t) {
if (t == NULL)
return(NULL); //si árbol vacío retorna NULL
else // Si no es vacío
if (t->left == NULL)
return(t); // Si no tiene hijo izquierdo: lo encontró.
else
return( BuscaMinimoRec (t->left) ); //busca en subárbol izquierdo.
}
8: Arboles 22
Buscar máximo
pnodo BuscarMaximoIterativo(pnodo t) {
while ( t != NULL) {
if ( t->right == NULL )
return (t); //apunta al máximo.
else
t=t->right; //desciende
}
return (t); /* NULL Si árbol vacío*/
}
pnodo BuscaMaximoRec(pnodo t) {
if (t == NULL)
return(NULL); //si árbol vacío retorna NULL
if (t->right == NULL)
return(t ); // Si no tiene hijo derecho: lo encontró.
return( BuscaMaximoRec (t->right) ); //sigue buscando en subárbol der.
}
8: Arboles 23
Nodo descendiente del subárbol derecho
con menor valor de clave
pnodo MenorDescendienteSD(pnodo t) {
if (t == NULL)
return(NULL); //si árbol vacío retorna NULL
if (t->right == NULL)
return(NULL ); // Si no tiene hijo derecho no hay sucesor.
return( BuscaMinimo (t->right) ); //sigue buscando en subárbol der.
}
8: Arboles 24
Nodo descendiente del subárbol derecho
con menor valor de clave II
Ì Para el diseño iterativo, deben estudiarse dos
casos:
r El caso D1, un nodo sin hijo izquierdo, indica que se
encontró el mínimo.
r El caso D2, debe descenderse por el subárbol
derecho de t, por la izquierda, mientras se tengan
hijos por la izquierda.
8: Arboles 25
Nodo descendiente del subárbol
derecho con menor valor de clave III
Ì Menor descendiente de subárbol derecho
pnodo MenorDescendienteIterativoSD(pnodo t) {
pnodo p;
if (t == NULL)
return(NULL); // si árbol vacío retorna NULL
if (t->right == NULL)
return(NULL ); // sin hijo derecho no hay sucesor.
else
p = t->right;
while ( p->left != NULL)
{ // mientras no tenga hijo izq descender por izq.
p = p->left;
} // al terminar while p apunta al menor descendiente
return (p); // retorna el menor
}
8: Arboles 26
Nodo sucesor
Ì Dado un nodo encontrar su sucesor no es el mismo
problema anterior, ya que el nodo podría ser una
hoja o un nodo sin subárbol derecho.
Ì Por ejemplo en la Figura, el sucesor del nodo con
clave 4 es el nodo con clave 5. El sucesor del nodo
2 es el nodo con valor 3.
Ì Se requiere disponer de un puntero al padre del
nodo, para que la operación sea de costo
logarítmico, en promedio.
Ì Si un nodo tiene subárbol derecho, el sucesor de
ese nodo es el ubicado más a la izquierda en ese
subárbol; si no tiene subárbol derecho, es el
menor ancestro (que está sobre el nodo en la
trayectoria hacia la raíz) que tiene a ese nodo
(e.g. 4) en su subárbol izquierdo.
Ì Como en peor caso debe ascenderse un
trayectoria del nodo hacia la raíz, el costo será
O(a), donde a es la altura del árbol.
8: Arboles 27
Nodo sucesor
Ì Algoritmo Sucesor:
Si el árbol no es vacío:
Si no tiene subárbol derecho:
Mientras exista el padre y éste apunte al nodo
dado por la derecha se asciende:
Hasta encontrar el primer padre por la
izquierda.
Si no existe ese padre, se retorna NULL, t
era el nodo con valor máximo
Si tiene subárbol derecho, el sucesor es el mínimo del
subárbol derecho.
8: Arboles 28
Nodo sucesor
pnodo Sucesor(pnodo t) {
pnodo p;
if (t == NULL)
return(NULL); //si árbol vacío retorna NULL
if (t->right == NULL) {
p = t->padre; //p apunta al padre de t
while ( p!=NULL && t == p->right) {
t=p; p=t->padre;
} //se asciende
return(p); //
}
else
return( BuscaMinimo (t->right) ); //busca mín. en subárbol der.
}
8: Arboles 29
Algoritmos relacionados
Ì Nodo descendiente del subárbol
izquierdo con mayor valor de
clave.
r Basta intercambiar left por right,
right por left y min por max en los
diseños desarrollado previamente
para MenorDescendienteSD.
Ì Predecesor.
r El código de la función predecesor es
la imagen especular del código de
sucesor.
8: Arboles 30
Buscar
Ì Debido a la propiedad de los árboles binarios de
búsqueda, si el valor buscado no es igual al de
nodo actual, sólo existen dos posibilidades: que
sea mayor o que sea menor.
Lo que implica que el nodo buscado puede
pertenecer a uno de los dos subárboles.
Ì Cada vez que se toma la decisión de buscar en
uno de los subárboles de un nodo, se están
descartando los nodos del otro subárbol.
Ì En caso de árboles balanceados, se descarta la
mitad de los elementos de la estructura, esto
cumple el modelo: T(n) = T(n/2) +c, lo cual
asegura complejidad logarítmica.
8: Arboles 31
Buscar
pnodo BuscarIterativo( pnodo t, int valor) {
while ( t != NULL) {
if ( t->clave == valor ) // se debe implementar para distintos
return (t); // tipos de datos
else {
if (t->clave < valor )
t = t->right; //desciende por la derecha
else
t = t->left; //desciende por la izquierda
}
}
return (t); /* NULL No lo encontró*/
}
8: Arboles 32
Buscar II
pnodo BuscarRecursivo( pnodo t, int valor ) {
if ( t == NULL)
return (NULL); // árbol vacío o hijo de hoja
else {
if ( t->clave == valor )
return(t); // lo encontró
else {
if ( t->clave > valor )
t = BuscarRecursivo ( t->left, valor);
else
t = BuscarRecursivo ( t->right, valor);
}
}
return ( t ); // los retornos de las llamadas recursivas se pasan via t
}
8: Arboles 33
Buscar III
Ì Pueden eliminarse las asignaciones y el retorno final de esta forma:
pnodo BuscarRecursivo2( pnodo t, int valor ) {
if ( t == NULL)
return (NULL); /* árbol vacío o hijo de hoja */
else {
if ( t->clave == valor )
return (t); /* lo encontró */
else {
if ( t->clave > valor )
return ( BuscarRecursivo2 ( t->left, valor) );
else
return ( BuscarRecursivo2 ( t->right, valor)) ;
}
}
}
8: Arboles 34
Buscar: Complejidad
Ì Si T(a) es la complejidad de la búsqueda en un
árbol de altura a. En cada iteración, el problema
se reduce a uno similar, pero con la altura
disminuida en uno, y tiene costo constante el
disminuir la altura.
Ì Entonces: T(a) = T(a-1) + Θ(1)
Ì La solución de esta recurrencia, es:
T(a) = a Θ(1) = Θ(a)
Pero en árboles de búsqueda se tiene que:
log n ≤ a ≤ n
Entonces:
Θ( log n) ≤ T(a) ≤ Θ(n)
8: Arboles 35
8-Árboles Binarios
8.1 Definiciones y tipos de datos
8.2 Cálculos de complejidad
8.3 Operaciones básicas y de recorrido
8.4 Operaciones de consulta
8.5 Operaciones de modificación
8: Arboles 36
Insertar Nodos: Iterativo I
Ì Primero se busca el sitio para
insertar. Si el valor que se desea
insertar ya estaba en el árbol, no
se efectúa la operación; ya que no
se aceptan claves duplicadas.
Entonces: se busca el valor; y si no
está, se inserta el nuevo nodo.
Ì Es preciso almacenar en una
variable local q, la posición de la
hoja en la que se insertará el nuevo
nodo. q permite conectar el nuevo
nodo creado al árbol.
Ì Se recorre una trayectoria de la
raíz hasta una hoja para insertar.
Entonces, si a es la altura, la
complejidad de la inserción es:
T(a).
8: Arboles 37
Insertar Nodos: Iterativo I
typedef enum {left, right, vacio} modo;
pnodo InsertarIterativo(pnodo t, int valor) {
pnodo q= t; modo porlado=vacio;
while ( t != NULL) {
if ( t->clave == valor ) {
/* lo encontró, no inserta nodo */
return (t);
}
else {
q=t ;
if (t->clave < valor){
t = t->right;
porlado=right;
}
else {
t = t->left;
porlado=left;
}
}
}
/*Al salir del while q apunta al nodo en
el arbol donde se insertará el nuevo
nodo, y porlado la dirección */
/* El argumento t apunta a NULL */
t = CreaNodo(valor);
if (porlado==left)
q->left=t;
else if(porlado==right)
q->right=t;
return (t); /* Apunta al recién
insertado. Null si no se pudo
insertar*/
}
8: Arboles 38
Insertar Nodos: Iterativo II
pnodo Insertar(pnodo t, int valor)
{
pnodo *p = &t;
while (*p != NULL)
{
if ((*p)->clave < valor)
p = &((*p)->right);
else if ((*p)->clave > valor)
p = &((*p)->left);
else
{
/* Ya estaba. No hace nada */
return t;
}
}
*p = CreaNodo(valor);
return t;
}
int main()
{
pnodo pRoot = NULL;
pRoot = Insertar(pRoot, 5);
Insertar(pRoot, 3);
Insertar(pRoot, 7);
Insertar(pRoot, 1);
Insertar(pRoot, 4);
return 0;
}
8: Arboles 39
Insertar Nodos: Recursivo
pnodo InsertarRecursivo( pnodo t, int valor) {
if (t == NULL) {
t = CreaNodo(valor); //insertar en árbol vacío o en hoja.
}
else if (valor < t->clave) { //insertar en subárbol izquierdo.
t->left = InsertarRecursivo(t->left, valor);
}
else if (valor > t->clave) {//insertar en subárbol derecho
t->right = InsertarRecursivo (t->right, valor);
}
/* else: valor ya estaba en el árbol. No hace nada. */
return(t);
}
8: Arboles 40
Descartar Nodos
Ì Primero se busca el nodo cuyo valor de
clave es igual al valor pasado como
argumento. Si no lo encuentra retorna
NULL. Si lo encuentra, se producen varios
casos. Lo importante es mantener la
vinculación entre los elementos del árbol:
r a) El nodo que se desea descartar es una
hoja. En este caso, la operación es trivial,
basta escribir un puntero con valor nulo. La
estructura se conserva.
r b) El nodo que se desea descartar es un
nodo interno. i) con un hijo por la izquierda
o la derecha el padre debe apuntar al nieto,
para conservar la estructura de árbol. Esto
implica mantener un puntero al padre, en el
descenso.
8: Arboles 41
Descartar Nodos
Ì b) El nodo que se desea descartar
es un nodo interno.
i) con un hijo por la izquierda o la
derecha el padre debe apuntar al
nieto, para conservar la estructura
de árbol. Esto implica mantener un
puntero al padre, en el descenso.
ii) con dos hijos para conservar la
estructura del árbol, se debe
buscar I, el mayor descendiente
del hijo izquierdo; o bien D, el
menor descendiente del hijo
derecho. Luego reemplazar la hoja
obtenida por el nodo a descartar.
r Se muestra la operación buscando D.
8: Arboles 42
pnodo Descartar(pnodo t, int valor) {
pnodo temp;
if (t == NULL)
printf("Elemento no encontradon");
else if (valor < t->clave) /* por la izquierda */
t->left = Descartar(t->left, valor);
else if (valor > t->clave) /* por la derecha */
t->right = Descartar(t->right, valor);
else { /* se encontró el elemento a descartar */
if (t->left && t->right) { /* dos hijos: remplazar con D */
temp = MenorDescendiente(t->right) ;
t->clave = temp->clave; //copia el nodo y borra la hoja
t->right = Descartar(t->right, temp->clave);
}
else { /* un hijo o ninguno */
...continua...
Descartar Nodos II
8: Arboles 43
...continuacion...
else { /* un hijo o ninguno */
temp = t;
if (t->left == NULL) /* sólo hijo derecho o sin hijos */
t = t->right;
else if (t->right == NULL) /* solamente un hijo izquierdo
*/
t = t->left;
free(temp); /*libera espacio */
}
}
return(t);
}
Descartar Nodos III
8: Arboles 44
Descartar Árbol
Ì Primero borra los subarboles y luego la raiz
pnodo deltree(pnodo t) {
if (t != NULL) {
t->left = deltree(t->left);
t->right = deltree(t->right);
free(t);
}
return NULL;
}
8: Arboles 45
Profundidad del Árbol
int Profundidad(pnodo t) {
int left=0, right = 0;
if(t==NULL)
return 0; //Si árbol vacío, profundidad 0
if(t->left != NULL)
left = Profundidad(t->left); //calcula prof. sub arb. I
if(t->right != NULL)
right = Profundidad(t->right); //calcula prof. sub arb.D
if( left > right) //si el izq tiene mayor profundidad
return left+1; //retorna profundidad del sub arb izq + 1
else
return right+1; //retorna prof. del sub arb der + 1
}
8: Arboles 46
Altura del Árbol
int Altura(pnodo T) {
int h, max;
if (T == NULL)
return -1;
else {
h = Altura (T->left);
max = Altura (T->right);
if (h > max)
max = h;
return(max+1);
}
}
8: Arboles 47
Numero de Hojas del Árbol
int NumerodeHojas(pnodo t) {
int total = 0; //Si árbol vacío, no hay hojas
if(t==NULL)
return 0;
// Si es hoja, la cuenta
if(t->left == NULL && t->right == NULL)
return 1;
//cuenta las hojas del subárbol izquierdo
if(t->left!= NULL)
total += NumerodeHojas(t->left);
//cuenta las hojas del subárbol derecho
if(t->right!=0)
total += NumerodeHojas(t->right);
return total; //total de hojas en subárbol
}
8: Arboles 48
Contar Nodos del Arbol
int ContarNodos(pnodo t) {
if (t == NULL)
return 0;
return (1 + ContarNodos(t->left) +
ContarNodos(t->right) );
}
Ì Algunas otras posibilidades:
r Contar nodos internos.
r Contar nodos con valores menores o mayores que un
valor dado.
r Etc...
8: Arboles 49
Partir el Arbol
pnodo split(int key, pnodo t,
pnodo *l, pnodo *r) {
while (t != NULL && t-
>clave != key) {
if (t->clave < key) {
*l = t;
t = t->right;
l = &((*l)->right);
} else {
*r = t;
t = t->left;
r = &((*r)->left);
}
} // fin del while
if (t == NULL) {
*l = NULL;
*r = NULL;
}
else { /* t->clave == key */
*l = t->left;
*r = t->right;
}
return t;
}
8: Arboles 50
Insertar Nueva Raíz
pnodo InsertarRaiz(int key, pnodo t) {
pnodo l, r;
t = split(key, t, &l, &r);
if (t == NULL) {
t = CreaNodo(key);
t->left = l;
t->right = r;
}
else {
t->left = l;
t->right = r;
Error();
}
return t;
}
8: Arboles 51
Unir dos Árboles
pnodo join(pnodo l, pnodo r) {
pnodo t = NULL;
pnodo *p = &t;
while (l != NULL && r != NULL) {
if (rand()%2) { //cara y sello.
*p = l;
p = &((*p)->right);
l = l->right;
} else {
*p = r;
p = &((*p)->left);
r = r->left;
}
} // fin del while
if (l == NULL)
*p = r;
else /* (r == NULL)
*/
*p = l;
return t;
}

Más contenido relacionado

La actualidad más candente

Bubble Sort Algorithm Presentation
Bubble Sort Algorithm Presentation Bubble Sort Algorithm Presentation
Bubble Sort Algorithm Presentation AhmedAlbutty
 
3 modelo er
3 modelo er3 modelo er
3 modelo erramume69
 
Programación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosProgramación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosAngel Vázquez Patiño
 
Programación 3: Grafos, representación y operaciones
Programación 3: Grafos, representación y operacionesProgramación 3: Grafos, representación y operaciones
Programación 3: Grafos, representación y operacionesAngel Vázquez Patiño
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoJosé Antonio Sandoval Acosta
 
5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarioselcapo2008
 
Estructuras lineales unidad 3
Estructuras lineales unidad 3Estructuras lineales unidad 3
Estructuras lineales unidad 3eliezerbs
 
Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: ListaEmerson Garay
 
Binary Search Tree (BST)
Binary Search Tree (BST)Binary Search Tree (BST)
Binary Search Tree (BST)M Sajid R
 
Programación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosProgramación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosAngel Vázquez Patiño
 
Searching and Sorting Techniques in Data Structure
Searching and Sorting Techniques in Data StructureSearching and Sorting Techniques in Data Structure
Searching and Sorting Techniques in Data StructureBalwant Gorad
 
Ascenso a la Colina
Ascenso a la ColinaAscenso a la Colina
Ascenso a la ColinaTutor4uDev
 
Estructura de datos lineales y no lineales
Estructura de datos lineales y no linealesEstructura de datos lineales y no lineales
Estructura de datos lineales y no linealeslos4estatidinamicos
 

La actualidad más candente (20)

Bubble Sort Algorithm Presentation
Bubble Sort Algorithm Presentation Bubble Sort Algorithm Presentation
Bubble Sort Algorithm Presentation
 
3 modelo er
3 modelo er3 modelo er
3 modelo er
 
Insertion and merge sort
Insertion and merge sortInsertion and merge sort
Insertion and merge sort
 
Programación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosProgramación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenados
 
Programación 3: Grafos, representación y operaciones
Programación 3: Grafos, representación y operacionesProgramación 3: Grafos, representación y operaciones
Programación 3: Grafos, representación y operaciones
 
ARBOLES BINARIOS
ARBOLES BINARIOSARBOLES BINARIOS
ARBOLES BINARIOS
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de Ordenamiento
 
Arboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de BusquedaArboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de Busqueda
 
5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarios
 
Insertion Sort
Insertion SortInsertion Sort
Insertion Sort
 
Estructuras lineales unidad 3
Estructuras lineales unidad 3Estructuras lineales unidad 3
Estructuras lineales unidad 3
 
Recursividad
RecursividadRecursividad
Recursividad
 
Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: Lista
 
Ordenamiento parte 2
Ordenamiento parte 2Ordenamiento parte 2
Ordenamiento parte 2
 
Binary Search Tree (BST)
Binary Search Tree (BST)Binary Search Tree (BST)
Binary Search Tree (BST)
 
Programación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosProgramación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibrados
 
Searching and Sorting Techniques in Data Structure
Searching and Sorting Techniques in Data StructureSearching and Sorting Techniques in Data Structure
Searching and Sorting Techniques in Data Structure
 
Ascenso a la Colina
Ascenso a la ColinaAscenso a la Colina
Ascenso a la Colina
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Estructura de datos lineales y no lineales
Estructura de datos lineales y no linealesEstructura de datos lineales y no lineales
Estructura de datos lineales y no lineales
 

Similar a Árboles binarios (20)

Estructura de datos unidad 4 y 5
Estructura de datos unidad 4 y 5Estructura de datos unidad 4 y 5
Estructura de datos unidad 4 y 5
 
Unidad 6
Unidad 6Unidad 6
Unidad 6
 
04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles
 
Programacion estructura de arboles en c
Programacion estructura de arboles en cProgramacion estructura de arboles en c
Programacion estructura de arboles en c
 
Sustentacion arboles
Sustentacion arbolesSustentacion arboles
Sustentacion arboles
 
Arboles
ArbolesArboles
Arboles
 
Árboles Binarios y Grafos
Árboles Binarios  y GrafosÁrboles Binarios  y Grafos
Árboles Binarios y Grafos
 
Arboles binarios
Arboles binariosArboles binarios
Arboles binarios
 
Arboles
Arboles Arboles
Arboles
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
Arboles
Arboles Arboles
Arboles
 
Arboles
ArbolesArboles
Arboles
 
Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Codificación de Huffman
Codificación de Huffman Codificación de Huffman
Codificación de Huffman
 
Arboles
ArbolesArboles
Arboles
 
Arboles ppt
Arboles pptArboles ppt
Arboles ppt
 
Estructura de Datos - árboles y grafos
Estructura de Datos - árboles y grafosEstructura de Datos - árboles y grafos
Estructura de Datos - árboles y grafos
 

Más de Cecilia Loeza

10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...
10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...
10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...Cecilia Loeza
 
Funciones hiperbólicas
Funciones hiperbólicasFunciones hiperbólicas
Funciones hiperbólicasCecilia Loeza
 
Sistemas lineales tablas
Sistemas lineales tablasSistemas lineales tablas
Sistemas lineales tablasCecilia Loeza
 
Fourier y sus coeficientes Cañada
Fourier y sus coeficientes CañadaFourier y sus coeficientes Cañada
Fourier y sus coeficientes CañadaCecilia Loeza
 
Variable de frecuencia compleja
Variable de frecuencia complejaVariable de frecuencia compleja
Variable de frecuencia complejaCecilia Loeza
 
Movimiento ondulatorio
Movimiento ondulatorioMovimiento ondulatorio
Movimiento ondulatorioCecilia Loeza
 
Los sistemas de informacion en la empresa nota tecnica - carlos suarez rey
Los sistemas de informacion en la empresa   nota tecnica - carlos suarez reyLos sistemas de informacion en la empresa   nota tecnica - carlos suarez rey
Los sistemas de informacion en la empresa nota tecnica - carlos suarez reyCecilia Loeza
 
Temas selectos de estructuras de datos
Temas selectos de estructuras de datosTemas selectos de estructuras de datos
Temas selectos de estructuras de datosCecilia Loeza
 
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL I
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL IESTADÍSTICA DESCRIPTIVA E INFERENCIAL I
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL ICecilia Loeza
 
Potencial eléctricoPotencial electrico
Potencial eléctricoPotencial electricoPotencial eléctricoPotencial electrico
Potencial eléctricoPotencial electricoCecilia Loeza
 
Estadística descriptiva
Estadística descriptivaEstadística descriptiva
Estadística descriptivaCecilia Loeza
 
Unidad iii Pilas y colas
Unidad iii Pilas y colasUnidad iii Pilas y colas
Unidad iii Pilas y colasCecilia Loeza
 
Estructuras lineales
Estructuras linealesEstructuras lineales
Estructuras linealesCecilia Loeza
 
Matemáticas discretas
Matemáticas discretasMatemáticas discretas
Matemáticas discretasCecilia Loeza
 

Más de Cecilia Loeza (20)

10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...
10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...
10 Adivinanzas de animales, elementos de la naturaleza, objetos, frutas, verd...
 
Java
JavaJava
Java
 
Funciones hiperbólicas
Funciones hiperbólicasFunciones hiperbólicas
Funciones hiperbólicas
 
Sistemas lineales tablas
Sistemas lineales tablasSistemas lineales tablas
Sistemas lineales tablas
 
Fourier y sus coeficientes Cañada
Fourier y sus coeficientes CañadaFourier y sus coeficientes Cañada
Fourier y sus coeficientes Cañada
 
Variable de frecuencia compleja
Variable de frecuencia complejaVariable de frecuencia compleja
Variable de frecuencia compleja
 
Integral de fourier
Integral de fourierIntegral de fourier
Integral de fourier
 
Resistores normales
Resistores normalesResistores normales
Resistores normales
 
Movimiento ondulatorio
Movimiento ondulatorioMovimiento ondulatorio
Movimiento ondulatorio
 
Los sistemas de informacion en la empresa nota tecnica - carlos suarez rey
Los sistemas de informacion en la empresa   nota tecnica - carlos suarez reyLos sistemas de informacion en la empresa   nota tecnica - carlos suarez rey
Los sistemas de informacion en la empresa nota tecnica - carlos suarez rey
 
Temas selectos de estructuras de datos
Temas selectos de estructuras de datosTemas selectos de estructuras de datos
Temas selectos de estructuras de datos
 
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL I
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL IESTADÍSTICA DESCRIPTIVA E INFERENCIAL I
ESTADÍSTICA DESCRIPTIVA E INFERENCIAL I
 
Autómatas
AutómatasAutómatas
Autómatas
 
Potencial eléctricoPotencial electrico
Potencial eléctricoPotencial electricoPotencial eléctricoPotencial electrico
Potencial eléctricoPotencial electrico
 
Estadística descriptiva
Estadística descriptivaEstadística descriptiva
Estadística descriptiva
 
Combinatoria
CombinatoriaCombinatoria
Combinatoria
 
Ecologia 3ra ed
Ecologia 3ra edEcologia 3ra ed
Ecologia 3ra ed
 
Unidad iii Pilas y colas
Unidad iii Pilas y colasUnidad iii Pilas y colas
Unidad iii Pilas y colas
 
Estructuras lineales
Estructuras linealesEstructuras lineales
Estructuras lineales
 
Matemáticas discretas
Matemáticas discretasMatemáticas discretas
Matemáticas discretas
 

Último

CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIAMayraOchoa35
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfmatepura
 
Una estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTUna estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTFundación YOD YOD
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdfevin1703e
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaXjoseantonio01jossed
 
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfCAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfReneBellido1
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfyoseka196
 
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfpaola110264
 
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfPresentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfMirthaFernandez12
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaXimenaFallaLecca1
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPJosLuisFrancoCaldern
 
Normas para los aceros basados en ASTM y AISI
Normas para los aceros basados en ASTM y AISINormas para los aceros basados en ASTM y AISI
Normas para los aceros basados en ASTM y AISIfimumsnhoficial
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdffredyflores58
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaANDECE
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxEduardoSnchezHernnde5
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfMikkaelNicolae
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEANDECE
 

Último (20)

VALORIZACION Y LIQUIDACION MIGUEL SALINAS.pdf
VALORIZACION Y LIQUIDACION MIGUEL SALINAS.pdfVALORIZACION Y LIQUIDACION MIGUEL SALINAS.pdf
VALORIZACION Y LIQUIDACION MIGUEL SALINAS.pdf
 
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdf
 
Una estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NISTUna estrategia de seguridad en la nube alineada al NIST
Una estrategia de seguridad en la nube alineada al NIST
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdf
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
 
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdfCAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
CAP4-TEORIA EVALUACION DE CAUDALES - HIDROGRAMAS.pdf
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdf
 
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
 
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdfPresentación Proyecto Trabajo Creativa Profesional Azul.pdf
Presentación Proyecto Trabajo Creativa Profesional Azul.pdf
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
 
Normas para los aceros basados en ASTM y AISI
Normas para los aceros basados en ASTM y AISINormas para los aceros basados en ASTM y AISI
Normas para los aceros basados en ASTM y AISI
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes Granada
 
Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptx
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSE
 

Árboles binarios

  • 1. 8: Arboles 1 ELO320 Estructuras de Datos y Algoritmos Arboles Binarios Tomás Arredondo Vidal Este material está basado en: Ì Robert Sedgewick, "Algorithms in C", (third edition), Addison-Wesley, 2001 Ì Thomas Cormen et al, “Algorithms”, (eighth edition), MIT Press, 1992. Ì material del curso ELO320 del Prof. Leopoldo Silva Ì material en el sitio http://es.wikipedia.org
  • 2. 8: Arboles 2 8-Árboles Binarios 8.1 Definiciones y tipos de datos 8.2 Cálculos de complejidad 8.3 Operaciones básicas y de recorrido 8.4 Operaciones de consulta 8.5 Operaciones de modificación
  • 3. 8: Arboles 3 Definiciones Ì Un árbol es una estructura de datos con nodos enlazados en forma jerárquica y orientada. r Es una estructura ordenada en que los hijos de un nodo generalmente tienen un valor menor que este y están ordenados de izquierda a derecha. Ì La raíz es el punto de entrada a la estructura. Ì La raíz puede tener cero o más nodos descendientes desde ella. r El conjunto de estos nodos forman subárboles de la raíz. r La raíz es el ancestro de estos subárboles. r Los nodos sin descendientes se llaman hojas. r Los nodos internos son todos los nodos menos las hojas.
  • 4. 8: Arboles 4 Definiciones II Ì Una trayectoria del nodo ni al nodo nk, es una secuencia de nodos desde ni hasta nk, tal que ni es el padre de ni+1. Ì Existe un solo enlace (link) entre un padre y cada uno de sus hijos. Ì El largo de una trayectoria es el número de enlaces en la trayectoria. r Una trayectoria de k nodos tiene largo k-1. Ì La altura de un nodo es el largo de la trayectoria más larga de ese nodo a una hoja. Ì La profundidad de un nodo es el largo de la trayectoria desde la raíz a ese nodo. r La profundidad del árbol es la profundidad de la hoja mas profunda. r Nodos a una misma profundidad están al mismo nivel.
  • 5. 8: Arboles 5 Definiciones III Ì Árboles binarios r Cada nodo puede tener un hijo izquierdo y/o un hijo derecho. r Un árbol binario está formado por un nodo raíz, un subárbol izquierdo I y uno derecho D. • Donde I y D son árboles binarios. Los subárboles se suelen representar gráficamente como triángulos.
  • 6. 8: Arboles 6 Definiciones IV Ì Árboles binarios de búsqueda r Las claves de los nodos del subárbol izquierdo deben ser menores que la clave de la raíz. r Las claves de los nodos del subárbol derecho deben ser mayores que la clave de la raíz. r Esta definición no acepta elementos con claves duplicadas. r Se indican el descendiente del subárbol izquierdo con mayor valor de clave y el descendiente del subárbol derecho con menor valor; los cuales son el antecesor y sucesor de la raíz.
  • 7. 8: Arboles 7 Tipos de datos Ì Para un árbol binario hay que usar dos punteros. r Se da un ejemplo con una clave entera, no se muestra espacio para los otros datos que puede estar asociada al nodo. r En la implementación de algunas operaciones conviene disponer de un puntero al padre del nodo (tampoco se muestra en este ejemplo). Ì struct node { int clave; struct node *left; struct node *right; }; typedef node * pnode;
  • 8. 8: Arboles 8 8-Árboles Binarios 8.1 Definiciones y tipos de datos 8.2 Cálculos de complejidad 8.3 Operaciones básicas y de recorrido 8.4 Operaciones de consulta 8.5 Operaciones de modificación
  • 9. 8: Arboles 9 Complejidad: árboles completos Ì Deduciremos, de manera inductiva la altura de las hojas en función del número de nodos. Ì El caso más simple de un árbol completo tiene tres nodos, un nivel y altura (A) de dos. Ì Hemos modificado levemente la definición de altura, como el número de nodos que deben ser revisados desde la raíz a las hojas, ya que la complejidad de los algoritmos dependerá de esta variable. r A medida que se avanza en la trayectoria se descarta T(n/2) nodos en cada avance. Ì Un árbol perfectamente balanceado que tiene n nodos internos tiene n+1 hojas. Ì Árbol de nivel 1. Nodos = 3 = 22-1 Altura = 2 Ì Árbol de nivel 2. Nodos = 7 = 23-1 Altura = 3 Ì Árbol de nivel 3. Nodos = 15 = 24-1 Altura = 4 Ì Árbol de n nodos: n = 2A-1 A = log2(n+1) = O(log n)
  • 10. 8: Arboles 10 Complejidad: árboles con un nivel de desbalance Ì Se ilustran los tres casos de árboles, de nivel dos, con un nivel de desbalance, para n = 4, 5 y 6. Ì En general para n nodos se tiene: 2A-1 ≤ n ≤ 2A-2 A <= (1 + log2(n) ) para la primera desigualdad y A >= log2 (n +2) para la segunda. Ì Cual es la complejidad de A? Ì Se pueden encontrar constantes (i.e. c1,c2) que acoten, por arriba y por abajo a ambas funciones para n > 10,079: 1*log2 n <=log2 (n+2) <= A <= 1 + log2n <= 1.3* log2n A = Θ(log n) Ì Árboles de nivel 2. Nodos de 4 a 6 De 23-1 hasta 23-2 Altura = 3 Ì Árboles de nivel 3. Nodos de 8 a 14 De 24-1 hasta 24-2 Altura = 4 Ì Árbol de nivel m. Nodos: 2A-1 ≤ n ≤ 2A-2 Altura = A
  • 11. 8: Arboles 11 Complejidad: árboles construidos en forma aleatoria Ì Para n nodos, con claves: 1, 2, 3, …, n, se pueden construir n! árboles. Ya que existen n! permutaciones de n elementos. Ì El orden de los elementos de la permutación, es el orden en que se ingresan las claves a partir de un árbol vacío. Ì Lo que se desea conocer es la altura An, definida como la altura promedio de las búsquedas de las n claves y promediadas sobre los n! árboles que se generan a partir de las n! permutaciones que se pueden generar con la n claves diferentes. Ì Si el orden de llegada de las claves que se insertan al árbol se genera en forma aleatoria, la probabilidad de que la primera clave, que es la raíz, tenga valor i es 1/n. Ì Esto dado que todas las claves son igualmente probables. Ì El subárbol izquierdo contiene (i-1) nodos; por lo tanto el subárbol derecho contiene (n-i) nodos. Ì Para este tipo de árbol en promedio el largo de cualquier trayectoria es: An ≈ 2ln(n) = O(log 2)
  • 12. 8: Arboles 12 Complejidad: árboles construidos en forma aleatoria (cont) Ì La gráfica muestra que para árboles de tipo 1000 nodos, deben recorrerse cerca de nueve nodos desde la raíz hasta las hojas (peor caso), si está balanceado. Ì El largo promedio de los recorridos es 12 en un árbol generado aleatoriamente, y 1000 en peor caso. Ì Contrastando con un árbol balanceado para n grande: An/A≈ 2ln(n)/2log2(n)≈ 1,3 Ì Para n grande en promedio el alargue es entre un 20 - 39%
  • 13. 8: Arboles 13 8-Árboles Binarios 8.1 Definiciones y tipos de datos 8.2 Cálculos de complejidad 8.3 Operaciones básicas y de recorrido 8.4 Operaciones de consulta 8.5 Operaciones de modificación
  • 14. 8: Arboles 14 Recorridos en árboles Ì Existen tres modos de recorrido, con las siguientes definiciones recursivas: r En orden: Se visita el subárbol izquierdo en orden; Se visita la raíz; Se visita el subárbol derecho en orden. r Pre orden: Se visita la raíz; Se visita el subárbol izquierdo en preorden; Se visita el subárbol derecho en preorden. r Post orden: Se visita el subárbol izquierdo en postorden; Se visita el subárbol derecho en postorden; Se visita la raíz. Ì Ejemplo: Como se recorreria el árbol formado con el siguiente conjunto de claves usando los tres modos? { n0, n1, n2, n3, n4, n5} Ì En orden: {n1, n3, n4}, n0, {n2, n5} n3, n1, n4, n0, {n2, n5} n3, n1, n4, n0, n2, n5 Ì Pre orden: n0, {n1, n3, n4}, {n2, n5} n0, n1, n3, n4, {n2, n5} n0, n1, n3, n4, n2, n5 Ì Post orden: {n1, n3, n4}, {n2, n5}, n0 n3, n4, n1, {n2, n5}, n0 n3, n4, n1, n5, n2, n0
  • 15. 8: Arboles 15 Recorridos en árboles II Ì Notación in situ, corresponde a recorrido en orden: I, n0, D Ì Como seria el arbol? ( a * b) / (c + d) Ì Como seria un recorrido en post orden (RPN)? a b * c d + / Ì Tarea, encontrar expresión in situ para la polaca inversa: a b c / + d e f * - *
  • 16. 8: Arboles 16 Operaciones básicas: crear nodo Ì Crear árbol vacío: pnodo arbol=NULL; Ì Crea nodo inicializado con un valor: pnodo CreaNodo(int valor) { pnodo pi=NULL; if ( (pi= (pnodo) malloc(sizeof(nodo))) ==NULL) return (0); else { pi->clave=valor; pi->left=NULL; pi->right=NULL; } return(pi); }
  • 17. 8: Arboles 17 Operaciones básicas: recorrer en orden void RecorraEnOrden(pnodo p) { if (p!= NULL) //si no llegó a hojas y no es árbol vacío. { RecorraEnOrden(p->left); // primero recorre el // subárbol izquierdo. printf ("%d n", p->clave); // imprime el nodo RecorraEnOrden(p->right); // recorre subarbol der. } } Ì Si se tiene un árbol de n nodos, y si se asume arbitrariamente que el subárbol izquierdo tiene k nodos, se puede plantear que la complejidad temporal del recorrido es: T(n) = T(k) + Θ(1) + T(n-k-1)
  • 18. 8: Arboles 18 Operaciones básicas: recorrer II Ì Para simplificar el cálculo podemos asumir un árbol balanceado: T(n) = T(n/2) + Θ(1) + T(n/2 - 1) Ì Y para grandes valores de n, podemos simplificar aún más: T(n) = 2*T(n/2) que tiene por solución: T(n) = n = Θ(n) Ì Otro cálculo es considerar el peor caso para el subárbol derecho: T(n) = T(1) + Θ(1) + T(n - 2) Ì La que se puede estudiar como T(n) = T (n -2) + 2 asumiendo Θ(1)=T(1) = 1, T(2) = 1 que tiene por solución T(n) = n – (1/2)(1+(-1)n). Ì El segundo término toma valor cero para n par, y menos uno para n impar. Ì Puede despreciarse para grandes valores de n, resultando: T(n) = Θ(n)
  • 19. 8: Arboles 19 Operaciones básicas: recorrer mostrando nivel Ì Recorrer en orden mostrando nivel: void inorder(pnodo t, int nivel) { if (t != NULL) { inorder(t->left, nivel+1); printf ("%d %d n", t->clave, nivel); inorder(t->right, nivel +1); } } Ì Ejemplo de uso: inorder(arbol, 0); //Imprime considerando raíz de nivel 0. Ì Mostrar en post-orden y pre-orden son análogos a como se implemento RecorreEnOrden( ) e inorder( ).
  • 20. 8: Arboles 20 8-Árboles Binarios 8.1 Definiciones y tipos de datos 8.2 Cálculos de complejidad 8.3 Operaciones básicas y de recorrido 8.4 Operaciones de consulta 8.5 Operaciones de modificación
  • 21. 8: Arboles 21 Buscar mínimo pnodo BuscarMinimoIterativo(pnodo t) { while ( t != NULL) { if ( t->left == NULL ) return (t); //apunta al mínimo. else t=t->left; //desciende por la izquierda } return (t); /* NULL si árbol vacío*/ } pnodo BuscaMinimoRec(pnodo t) { if (t == NULL) return(NULL); //si árbol vacío retorna NULL else // Si no es vacío if (t->left == NULL) return(t); // Si no tiene hijo izquierdo: lo encontró. else return( BuscaMinimoRec (t->left) ); //busca en subárbol izquierdo. }
  • 22. 8: Arboles 22 Buscar máximo pnodo BuscarMaximoIterativo(pnodo t) { while ( t != NULL) { if ( t->right == NULL ) return (t); //apunta al máximo. else t=t->right; //desciende } return (t); /* NULL Si árbol vacío*/ } pnodo BuscaMaximoRec(pnodo t) { if (t == NULL) return(NULL); //si árbol vacío retorna NULL if (t->right == NULL) return(t ); // Si no tiene hijo derecho: lo encontró. return( BuscaMaximoRec (t->right) ); //sigue buscando en subárbol der. }
  • 23. 8: Arboles 23 Nodo descendiente del subárbol derecho con menor valor de clave pnodo MenorDescendienteSD(pnodo t) { if (t == NULL) return(NULL); //si árbol vacío retorna NULL if (t->right == NULL) return(NULL ); // Si no tiene hijo derecho no hay sucesor. return( BuscaMinimo (t->right) ); //sigue buscando en subárbol der. }
  • 24. 8: Arboles 24 Nodo descendiente del subárbol derecho con menor valor de clave II Ì Para el diseño iterativo, deben estudiarse dos casos: r El caso D1, un nodo sin hijo izquierdo, indica que se encontró el mínimo. r El caso D2, debe descenderse por el subárbol derecho de t, por la izquierda, mientras se tengan hijos por la izquierda.
  • 25. 8: Arboles 25 Nodo descendiente del subárbol derecho con menor valor de clave III Ì Menor descendiente de subárbol derecho pnodo MenorDescendienteIterativoSD(pnodo t) { pnodo p; if (t == NULL) return(NULL); // si árbol vacío retorna NULL if (t->right == NULL) return(NULL ); // sin hijo derecho no hay sucesor. else p = t->right; while ( p->left != NULL) { // mientras no tenga hijo izq descender por izq. p = p->left; } // al terminar while p apunta al menor descendiente return (p); // retorna el menor }
  • 26. 8: Arboles 26 Nodo sucesor Ì Dado un nodo encontrar su sucesor no es el mismo problema anterior, ya que el nodo podría ser una hoja o un nodo sin subárbol derecho. Ì Por ejemplo en la Figura, el sucesor del nodo con clave 4 es el nodo con clave 5. El sucesor del nodo 2 es el nodo con valor 3. Ì Se requiere disponer de un puntero al padre del nodo, para que la operación sea de costo logarítmico, en promedio. Ì Si un nodo tiene subárbol derecho, el sucesor de ese nodo es el ubicado más a la izquierda en ese subárbol; si no tiene subárbol derecho, es el menor ancestro (que está sobre el nodo en la trayectoria hacia la raíz) que tiene a ese nodo (e.g. 4) en su subárbol izquierdo. Ì Como en peor caso debe ascenderse un trayectoria del nodo hacia la raíz, el costo será O(a), donde a es la altura del árbol.
  • 27. 8: Arboles 27 Nodo sucesor Ì Algoritmo Sucesor: Si el árbol no es vacío: Si no tiene subárbol derecho: Mientras exista el padre y éste apunte al nodo dado por la derecha se asciende: Hasta encontrar el primer padre por la izquierda. Si no existe ese padre, se retorna NULL, t era el nodo con valor máximo Si tiene subárbol derecho, el sucesor es el mínimo del subárbol derecho.
  • 28. 8: Arboles 28 Nodo sucesor pnodo Sucesor(pnodo t) { pnodo p; if (t == NULL) return(NULL); //si árbol vacío retorna NULL if (t->right == NULL) { p = t->padre; //p apunta al padre de t while ( p!=NULL && t == p->right) { t=p; p=t->padre; } //se asciende return(p); // } else return( BuscaMinimo (t->right) ); //busca mín. en subárbol der. }
  • 29. 8: Arboles 29 Algoritmos relacionados Ì Nodo descendiente del subárbol izquierdo con mayor valor de clave. r Basta intercambiar left por right, right por left y min por max en los diseños desarrollado previamente para MenorDescendienteSD. Ì Predecesor. r El código de la función predecesor es la imagen especular del código de sucesor.
  • 30. 8: Arboles 30 Buscar Ì Debido a la propiedad de los árboles binarios de búsqueda, si el valor buscado no es igual al de nodo actual, sólo existen dos posibilidades: que sea mayor o que sea menor. Lo que implica que el nodo buscado puede pertenecer a uno de los dos subárboles. Ì Cada vez que se toma la decisión de buscar en uno de los subárboles de un nodo, se están descartando los nodos del otro subárbol. Ì En caso de árboles balanceados, se descarta la mitad de los elementos de la estructura, esto cumple el modelo: T(n) = T(n/2) +c, lo cual asegura complejidad logarítmica.
  • 31. 8: Arboles 31 Buscar pnodo BuscarIterativo( pnodo t, int valor) { while ( t != NULL) { if ( t->clave == valor ) // se debe implementar para distintos return (t); // tipos de datos else { if (t->clave < valor ) t = t->right; //desciende por la derecha else t = t->left; //desciende por la izquierda } } return (t); /* NULL No lo encontró*/ }
  • 32. 8: Arboles 32 Buscar II pnodo BuscarRecursivo( pnodo t, int valor ) { if ( t == NULL) return (NULL); // árbol vacío o hijo de hoja else { if ( t->clave == valor ) return(t); // lo encontró else { if ( t->clave > valor ) t = BuscarRecursivo ( t->left, valor); else t = BuscarRecursivo ( t->right, valor); } } return ( t ); // los retornos de las llamadas recursivas se pasan via t }
  • 33. 8: Arboles 33 Buscar III Ì Pueden eliminarse las asignaciones y el retorno final de esta forma: pnodo BuscarRecursivo2( pnodo t, int valor ) { if ( t == NULL) return (NULL); /* árbol vacío o hijo de hoja */ else { if ( t->clave == valor ) return (t); /* lo encontró */ else { if ( t->clave > valor ) return ( BuscarRecursivo2 ( t->left, valor) ); else return ( BuscarRecursivo2 ( t->right, valor)) ; } } }
  • 34. 8: Arboles 34 Buscar: Complejidad Ì Si T(a) es la complejidad de la búsqueda en un árbol de altura a. En cada iteración, el problema se reduce a uno similar, pero con la altura disminuida en uno, y tiene costo constante el disminuir la altura. Ì Entonces: T(a) = T(a-1) + Θ(1) Ì La solución de esta recurrencia, es: T(a) = a Θ(1) = Θ(a) Pero en árboles de búsqueda se tiene que: log n ≤ a ≤ n Entonces: Θ( log n) ≤ T(a) ≤ Θ(n)
  • 35. 8: Arboles 35 8-Árboles Binarios 8.1 Definiciones y tipos de datos 8.2 Cálculos de complejidad 8.3 Operaciones básicas y de recorrido 8.4 Operaciones de consulta 8.5 Operaciones de modificación
  • 36. 8: Arboles 36 Insertar Nodos: Iterativo I Ì Primero se busca el sitio para insertar. Si el valor que se desea insertar ya estaba en el árbol, no se efectúa la operación; ya que no se aceptan claves duplicadas. Entonces: se busca el valor; y si no está, se inserta el nuevo nodo. Ì Es preciso almacenar en una variable local q, la posición de la hoja en la que se insertará el nuevo nodo. q permite conectar el nuevo nodo creado al árbol. Ì Se recorre una trayectoria de la raíz hasta una hoja para insertar. Entonces, si a es la altura, la complejidad de la inserción es: T(a).
  • 37. 8: Arboles 37 Insertar Nodos: Iterativo I typedef enum {left, right, vacio} modo; pnodo InsertarIterativo(pnodo t, int valor) { pnodo q= t; modo porlado=vacio; while ( t != NULL) { if ( t->clave == valor ) { /* lo encontró, no inserta nodo */ return (t); } else { q=t ; if (t->clave < valor){ t = t->right; porlado=right; } else { t = t->left; porlado=left; } } } /*Al salir del while q apunta al nodo en el arbol donde se insertará el nuevo nodo, y porlado la dirección */ /* El argumento t apunta a NULL */ t = CreaNodo(valor); if (porlado==left) q->left=t; else if(porlado==right) q->right=t; return (t); /* Apunta al recién insertado. Null si no se pudo insertar*/ }
  • 38. 8: Arboles 38 Insertar Nodos: Iterativo II pnodo Insertar(pnodo t, int valor) { pnodo *p = &t; while (*p != NULL) { if ((*p)->clave < valor) p = &((*p)->right); else if ((*p)->clave > valor) p = &((*p)->left); else { /* Ya estaba. No hace nada */ return t; } } *p = CreaNodo(valor); return t; } int main() { pnodo pRoot = NULL; pRoot = Insertar(pRoot, 5); Insertar(pRoot, 3); Insertar(pRoot, 7); Insertar(pRoot, 1); Insertar(pRoot, 4); return 0; }
  • 39. 8: Arboles 39 Insertar Nodos: Recursivo pnodo InsertarRecursivo( pnodo t, int valor) { if (t == NULL) { t = CreaNodo(valor); //insertar en árbol vacío o en hoja. } else if (valor < t->clave) { //insertar en subárbol izquierdo. t->left = InsertarRecursivo(t->left, valor); } else if (valor > t->clave) {//insertar en subárbol derecho t->right = InsertarRecursivo (t->right, valor); } /* else: valor ya estaba en el árbol. No hace nada. */ return(t); }
  • 40. 8: Arboles 40 Descartar Nodos Ì Primero se busca el nodo cuyo valor de clave es igual al valor pasado como argumento. Si no lo encuentra retorna NULL. Si lo encuentra, se producen varios casos. Lo importante es mantener la vinculación entre los elementos del árbol: r a) El nodo que se desea descartar es una hoja. En este caso, la operación es trivial, basta escribir un puntero con valor nulo. La estructura se conserva. r b) El nodo que se desea descartar es un nodo interno. i) con un hijo por la izquierda o la derecha el padre debe apuntar al nieto, para conservar la estructura de árbol. Esto implica mantener un puntero al padre, en el descenso.
  • 41. 8: Arboles 41 Descartar Nodos Ì b) El nodo que se desea descartar es un nodo interno. i) con un hijo por la izquierda o la derecha el padre debe apuntar al nieto, para conservar la estructura de árbol. Esto implica mantener un puntero al padre, en el descenso. ii) con dos hijos para conservar la estructura del árbol, se debe buscar I, el mayor descendiente del hijo izquierdo; o bien D, el menor descendiente del hijo derecho. Luego reemplazar la hoja obtenida por el nodo a descartar. r Se muestra la operación buscando D.
  • 42. 8: Arboles 42 pnodo Descartar(pnodo t, int valor) { pnodo temp; if (t == NULL) printf("Elemento no encontradon"); else if (valor < t->clave) /* por la izquierda */ t->left = Descartar(t->left, valor); else if (valor > t->clave) /* por la derecha */ t->right = Descartar(t->right, valor); else { /* se encontró el elemento a descartar */ if (t->left && t->right) { /* dos hijos: remplazar con D */ temp = MenorDescendiente(t->right) ; t->clave = temp->clave; //copia el nodo y borra la hoja t->right = Descartar(t->right, temp->clave); } else { /* un hijo o ninguno */ ...continua... Descartar Nodos II
  • 43. 8: Arboles 43 ...continuacion... else { /* un hijo o ninguno */ temp = t; if (t->left == NULL) /* sólo hijo derecho o sin hijos */ t = t->right; else if (t->right == NULL) /* solamente un hijo izquierdo */ t = t->left; free(temp); /*libera espacio */ } } return(t); } Descartar Nodos III
  • 44. 8: Arboles 44 Descartar Árbol Ì Primero borra los subarboles y luego la raiz pnodo deltree(pnodo t) { if (t != NULL) { t->left = deltree(t->left); t->right = deltree(t->right); free(t); } return NULL; }
  • 45. 8: Arboles 45 Profundidad del Árbol int Profundidad(pnodo t) { int left=0, right = 0; if(t==NULL) return 0; //Si árbol vacío, profundidad 0 if(t->left != NULL) left = Profundidad(t->left); //calcula prof. sub arb. I if(t->right != NULL) right = Profundidad(t->right); //calcula prof. sub arb.D if( left > right) //si el izq tiene mayor profundidad return left+1; //retorna profundidad del sub arb izq + 1 else return right+1; //retorna prof. del sub arb der + 1 }
  • 46. 8: Arboles 46 Altura del Árbol int Altura(pnodo T) { int h, max; if (T == NULL) return -1; else { h = Altura (T->left); max = Altura (T->right); if (h > max) max = h; return(max+1); } }
  • 47. 8: Arboles 47 Numero de Hojas del Árbol int NumerodeHojas(pnodo t) { int total = 0; //Si árbol vacío, no hay hojas if(t==NULL) return 0; // Si es hoja, la cuenta if(t->left == NULL && t->right == NULL) return 1; //cuenta las hojas del subárbol izquierdo if(t->left!= NULL) total += NumerodeHojas(t->left); //cuenta las hojas del subárbol derecho if(t->right!=0) total += NumerodeHojas(t->right); return total; //total de hojas en subárbol }
  • 48. 8: Arboles 48 Contar Nodos del Arbol int ContarNodos(pnodo t) { if (t == NULL) return 0; return (1 + ContarNodos(t->left) + ContarNodos(t->right) ); } Ì Algunas otras posibilidades: r Contar nodos internos. r Contar nodos con valores menores o mayores que un valor dado. r Etc...
  • 49. 8: Arboles 49 Partir el Arbol pnodo split(int key, pnodo t, pnodo *l, pnodo *r) { while (t != NULL && t- >clave != key) { if (t->clave < key) { *l = t; t = t->right; l = &((*l)->right); } else { *r = t; t = t->left; r = &((*r)->left); } } // fin del while if (t == NULL) { *l = NULL; *r = NULL; } else { /* t->clave == key */ *l = t->left; *r = t->right; } return t; }
  • 50. 8: Arboles 50 Insertar Nueva Raíz pnodo InsertarRaiz(int key, pnodo t) { pnodo l, r; t = split(key, t, &l, &r); if (t == NULL) { t = CreaNodo(key); t->left = l; t->right = r; } else { t->left = l; t->right = r; Error(); } return t; }
  • 51. 8: Arboles 51 Unir dos Árboles pnodo join(pnodo l, pnodo r) { pnodo t = NULL; pnodo *p = &t; while (l != NULL && r != NULL) { if (rand()%2) { //cara y sello. *p = l; p = &((*p)->right); l = l->right; } else { *p = r; p = &((*p)->left); r = r->left; } } // fin del while if (l == NULL) *p = r; else /* (r == NULL) */ *p = l; return t; }