Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arbol Parte 1
Arbol Parte 1
al rbol completo. Recuerda que cualquier nodo puede ser considerado como la raz de un rbol.
1. Padre = NULL
2. nodo = Raiz
3. Bucle: mientras actual no sea un rbol vaco o hasta que se encuentre el elemento.
a. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la
bsqueda en el rbol izquierdo: Padre=nodo, nodo=nodo->izquierdo.
b. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la
bsqueda en el rbol derecho: Padre=nodo, nodo=nodo->derecho.
4. Si nodo no es NULL, el elemento est en el rbol, por lo tanto salimos.
5. Si Padre es NULL, el rbol estaba vaco, por lo tanto, el nuevo rbol slo contendr el nuevo
elemento, que ser la raz del rbol.
6. Si el elemento es menor que el Padre, entonces insertamos el nuevo elemento como un
nuevo rbol izquierdo de Padre.
7. Si el elemento es mayor que el Padre, entonces insertamos el nuevo elemento como un
nuevo rbol derecho de Padre.
1. Padre = NULL
2. Si el rbol est vaco: el elemento no est en el rbol, por lo tanto salimos sin eliminar
ningn elemento.
3. Si el valor del nodo raz es igual que el del elemento que buscamos, estamos ante uno de los
siguientes casos:
a. El nodo raz es un nodo hoja:
i. Si 'Padre' es NULL, el nodo raz es el nico del rbol, por lo tanto el puntero
al rbol debe ser NULL.
ii. Si raz es la rama derecha de 'Padre', hacemos que esa rama apunte a NULL.
iii. Si raz es la rama izquierda de 'Padre', hacemos que esa rama apunte a
NULL.
iv. Eliminamos el nodo, y salimos.
b. El nodo no es un nodo hoja:
i. Buscamos el 'nodo' ms a la izquierda del rbol derecho de raz o el ms a la
derecha del rbol izquierdo. Hay que tener en cuenta que puede que slo
exista uno de esos rboles. Al mismo tiempo, actualizamos 'Padre' para que
apunte al padre de 'nodo'.
ii. Intercambiamos los elementos de los nodos raz y 'nodo'.
iii. Borramos el nodo 'nodo'. Esto significa volver a (3), ya que puede suceder
que 'nodo' no sea un nodo hoja.
4. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la
bsqueda en el rbol izquierdo.
5. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la
bsqueda en el rbol derecho.
void Borrar(Arbol *a, int dat) {
pNodo padre = NULL; /* (1) */
pNodo actual;
pNodo nodo;
int aux;
actual = *a;
while(!Vacio(actual)) { /* Bsqueda (2) else implcito */
if(dat == actual->dato) { /* (3) */
if(EsHoja(actual)) { /* (3-a) */
if(padre)/* (3-a-i caso else implcito) */
if(padre->derecho == actual) padre->derecho = NULL; /* (3-a-ii)
*/
else if(padre->izquierdo == actual) padre->izquierdo = NULL; /*
(3-a-iii) */
free(actual); /* (3-a-iv) */
actual = NULL;
return;
}
else { /* (3-b) */
/* Buscar nodo */
padre = actual; /* (3-b-i) */
if(actual->derecho) {
nodo = actual->derecho;
while(nodo->izquierdo) {
padre = nodo;
nodo = nodo->izquierdo;
}
}
else {
nodo = actual->izquierdo;
while(nodo->derecho) {
padre = nodo;
nodo = nodo->derecho;
}
}
/* Intercambio */
aux = actual->dato; /* (3-b-ii) */
actual->dato = nodo->dato;
nodo->dato = aux;
actual = nodo;
}
}
else {
padre = actual;
if(dat > actual->dato) actual = actual->derecho; /* (4) */
else if(dat < actual->dato) actual = actual->izquierdo; /* (5) */
}
}
}
Buscar un elemento en un rbol ABB
1. Si el valor del nodo raz es igual que el del elemento que buscamos, terminamos la bsqueda
con xito.
2. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la
bsqueda en el rbol izquierdo.
3. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la
bsqueda en el rbol derecho.
int Vacio(Arbol r) {
return r==NULL;
}
<span class="rojo"><a name="7_9_6"></a><h3>Comprobar si un nodo es hoja</h3>
<p>Esta funcin tambin es sencilla de implementar:</p>
{ejemplo}
int EsHoja(pNodo r) {
return !r->derecho && !r->izquierdo;
}
Para contar los nodos podemos recurrir a cualquiera de los tres modos de recorrer el rbol: inorden,
preorden o postorden y como accin incrementamos el contador de nodos. Para implementar este
algoritmo recurrimos a dos funciones:
auxContador(a, contador);
return *contador;
}
Es un problema parecido al anterior, pero ahora tenemos que contar la altura, no en nmero de
nodos. Cada vez que lleguemos a un nodo hoja, verificamos si la altura del nodo es la mxima, y si
lo es, actualizamos la altura del rbol a ese valor:
1. Iniciamos un recorrido del rbol en postorden, con la variable de altura igual a cero.
2. Cada vez que empecemos a recorrer una nueva rama, incrementamos la altura para ese nodo.
3. Despus de procesar las dos ramas, verificamos si la altura del nodo es mayor que la
variable que almacena la altura actual del rbol, si es as, actualizamos esa variable.
auxAltura(a, 0, altura);
return *altura;
}
Lo que haremos ser buscar el elemento del nodo del que queremos averiguar la altura. Cada vez
que avancemos un nodo incrementamos la variable que contendr la altura del nodo.
while(!Vacio(actual)) {
if(dat == actual->dato) return altura; /* dato encontrado. (2) */
else {
altura++; /* (3) */
if(dat < actual->dato) actual = actual->izquierdo; /* (4) */
else if(dat > actual->dato) actual = actual->derecho; /* (5) */
}
}
return -1; /* No est en rbol */
}
Aplicar una funcin a cada elemento del rbol, segn los tres posibles recorridos
Todos los recorridos se aplican de forma recursiva. En este ejemplo crearemos tres funciones, una
por cada tipo de recorrido, que aplicarn una funcin al elemento de cada nodo.
La funcin a aplicar puede ser cualquiera que admita como parmetro un puntero a un entero, y que
no tenga valor de retorno.
InOrden
PreOrden
PostOrden