You are on page 1of 9

ARBOL BINARIO

ALGORITMO PARA EL RECORRIDO DE ARBOL BINARIO : PREORDEN,


POSTORDEN, INORDEN

http://view.knowledgevision.com/presentation/a2e70eb244e44fc0ae4dc4cdbb9
804b9

UNIVERSIDAD FERMN TORO


VICERECTORADO ACADMICO
DECANATO DE INGENIERA
ESCUELA DE INGENIERA EN COMPUTACIN

ALGORITMO PARA EL RECORRIDO DE ARBOL BINARIO : PREORDEN,


POSTORDEN, INORDEN

Autor: Yanko Durn. C.I.: 20155416


Materia: Estructura de Datos 1
Seccin: SAIA A

CABUDARE. JULIO, 2015

El recorrido de rboles refiere al proceso de visitar de una manera sistemtica, exactamente una vez, cada
nodo en una estructura de datos de rbol (examinando y/o actualizando los datos en los nodos).
Preorden: (raz, izquierdo, derecho). Para recorrer un rbol binario no vaco en preorden, hay que realizar las
siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raz:
1.

Visite la raz

2.

Atraviese el sub-rbol izquierdo

3.

Atraviese el sub-rbol derecho

Inorden: (izquierdo, raz, derecho). Para recorrer un rbol binario no vaco en inorden (simtrico), hay que
realizar las siguientes operaciones recursivamente en cada nodo:
1.

Atraviese el sub-rbol izquierdo

2.

Visite la raz

3.

Atraviese el sub-rbol derecho

Postorden: (izquierdo, derecho, raz). Para recorrer un rbol binario no vaco en postorden, hay que realizar
las siguientes operaciones recursivamente en cada nodo:
1.

Atraviese el sub-rbol izquierdo

2.

Atraviese el sub-rbol derecho

3.

Visite la raz

En general, la diferencia entre preorden, inorden y postorden es cundo se recorre la raz. En los tres, se
recorre primero el sub-rbol izquierdo y luego el derecho.

En preorden, la raz se recorre antes que los recorridos de los subrboles izquierdo y derecho

En inorden, la raz se recorre entre los recorridos de los rboles izquierdo y derecho, y

En postorden, la raz se recorre despus de los recorridos por el subrbol izquierdo y el derecho

Algoritmos en Pseudocodigo:

PREORDEN(NODO) {El algoritmo realiza el recorrido preorden en un


rbol binario. NODO es un dato de tipo PUNTERO}

{INFO, IZQ y DER son campos del registro NODO. INFO es una o ms
variables de informacin del nodo, IZQ y DER son variables de tipo puntero}
Si NODO NULO entonces,
Visitar el NODO /* {Escribir la informacin NODO^.INFO} */
Regresa a PREORDEN con PREORDEN(NODO^.IZQ) /*{Llamada recursiva con la
rama izquierda}*/ Regresa a PREORDEN con PREORDEN(NODO^.DER) /*
{Llamada recursiva con la rama derecha} */
Fin-si
Fin-algoritmo

INORDEN(NODO) {El algoritmo realiza el recorrido inorden en un rbol


binario. NODO es un dato de tipo PUNTERO}

{INFO, IZQ y DER son campos del registro NODO. INFO es una o ms
variables de informacin del nodo, IZQ y DER son variables de tipo puntero}
Si NODONULO entonces,
INORDEN(NODO^.IZQ) {Llamada recursiva con la rama izquierda}
Visitar el NODO {Escribir la informacin NODO^.INFO}
INORDEN(NODO^.DER) {Llamada recursiva con la rama derecha}
Fin-si
Fin-algoritmo

POSTORDEN(NODO) {El algoritmo realiza el recorrido postorden en un


rbol binario. NODO es un dato de tipo PUNTERO}

{INFO, IZQ y DER son campos del registro NODO. INFO es una o ms variables
de informacin del nodo, IZQ y DER son variables de tipo puntero}
Si NODO NULO entonces ,
POSTORDEN(NODO^.IZQ) {Llamada recursiva con la rama izquierda}
POSTORDEN(NODO^.DER) {Llamada recursiva con la rama derecha}

Visitar el NODO {Escribir la informacin NODO^.INFO}


Fin-si
Fin-algoritmo.

* Crea un arbol binario y lo recorre en


* preorden, inorden, y en postOrden
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* estructura autoreferenciada */
struct nodoArbol {
struct nodoArbol *ptrIzq;
int dato;
struct nodoArbol *prtDer;
};

typedef struct nodoArbol NodoArbol; /* sinnimo de la estructura nodoArbol */


typedef NodoArbol *ptrNodoArbol; /* sinnimo de NodoArbol* */

/* prototipos */
void insertaNodo(ptrNodoArbol *ptrArbol, int valor);
void inOrden(ptrNodoArbol ptrArbol);

void preOrden(ptrNodoArbol ptrArbol);


void postOrden(ptrNodoArbol ptrArbol);

/* la funcin main comienza la ejecucin del programa */


int main()
{
int i; /* contador para el ciclo de 1 a 10 */
int elemento; /* variable para almacenar valores al azar */
ptrNodoArbol ptrRaiz = NULL; /* rbol inicialemnte vaco */

srand(time(NULL));
printf("Los nmeros colocados en el arbol son:\n");

/* inserta valores al azar entre 1 y 15 en el rbol */


for (i = 1; i <= 10; i++) {
elemento = rand() % 15;
printf("%3d", elemento);
insertaNodo(&ptrRaiz, elemento);
}

/* recorre el rbol en preorden */


printf("\n\nEl recorrido en preorden es:\n");
preOrden(ptrRaiz);

/* recorre el rbol en in inorden */


printf("\n\nEl recorrido inorden es:\n");

inOrden(ptrRaiz);

/* recorre el rbol en postOrden */


printf("\n\nEl recorrido en postOrden es:\n");
postOrden(ptrRaiz);

return 0;
}

/* inserta un nodo dentro del rbol */


void insertaNodo( ptrNodoArbol *ptrArbol, int valor )
{
/* si el rbol est vaco */
if (*ptrArbol == NULL) {
*ptrArbol = malloc(sizeof(NodoArbol));

/* si la memoria est asignada, entonces asigna el dato */


if (*ptrArbol != NULL) {
(*ptrArbol)->dato = valor;
(*ptrArbol)->ptrIzq = NULL;
(*ptrArbol)->prtDer = NULL;
} else {
printf("no se inserto %d. No hay memoria disponible.n", valor);
}
} else {
/* el dato a insertar es menor que el dato en el nodo actual */

if (valor < (*ptrArbol)->dato) {


insertaNodo(&((*ptrArbol)->ptrIzq), valor);
} else if (valor > (*ptrArbol)->dato) {
insertaNodo(&((*ptrArbol)->prtDer), valor);
} else {
printf("dup");
}
}
}

/* comienza el recorrido inorden del rbol */


void inOrden(ptrNodoArbol ptrArbol)
{
/* si el rbol no est vaco, entonces recrrelo */
if (ptrArbol != NULL) {
inOrden(ptrArbol->ptrIzq);
printf("%3d", ptrArbol->dato);
inOrden(ptrArbol->prtDer);
}
}

/* comienza el recorrido preorden del rbol */


void preOrden(ptrNodoArbol ptrArbol)
{
/* si el rbol no est vaco, entonces recrrelo */
if (ptrArbol != NULL) {

printf("%3d", ptrArbol->dato);
preOrden(ptrArbol->ptrIzq);
preOrden(ptrArbol->prtDer);
}
}

/* comienza el recorrido postOrden del rbol */


void postOrden(ptrNodoArbol ptrArbol)
{
/* si el rbol no est vaco, entonces recrrelo */
if (ptrArbol != NULL) {
postOrden(ptrArbol->ptrIzq);
postOrden(ptrArbol->prtDer);
printf("%3d", ptrArbol->dato);
}
}

You might also like