Está en la página 1de 5

//Luis Bohorquez y Kevin cubillos

#include <iostream>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input
loop */

struct Nodo{

int dato; //dato que se desea ingresar

Nodo *hijoDer; //puntero al hijo derecho

Nodo *hijoIzq; //puntero al hijo izquierdo

};

void insertarNodo(Nodo *&, int);

Nodo *arbol = NULL;

void imprimirArbol(Nodo *, int);

void recorridoPreOrden(Nodo *);

void recorridoInOrden(Nodo *);

void recorridoPostOrden(Nodo *);

int main() {

int dato, nivel=0; //el nivel empieza en cero para trabajar desde la raiz

char desea;

cout << "¿Desea insertar el primer dato al arbol(raiz)? (s/n): ";

cin >> desea;


if(desea == 'n' || desea == 'N'){ //Si el usuario no ingresa ningun nodo, se imprime que es
un arbol vacio

cout<<"Es un arbol vacio";

while(desea == 's' || desea == 'S'){ // Si desea ingresar un dato pasara a ser insertado al
arbol

cout<<"Digite un numero: ";

cin>>dato;

insertarNodo(arbol,dato);

cout<<"\nArbol Actual\n\n:"; //Al añadir un nodo se imprime como esta quedando


el arbol

imprimirArbol(arbol, nivel);

cout<<"¿Desea ingresar otro dato al arbol actual? (s/n)";

cin >>desea;

cout<<"\nEl recorrido del arbol en PreOrden es: ";

recorridoPreOrden(arbol);

cout<<"\nEl recorrido del arbol InOrden es: ";

recorridoInOrden(arbol);

cout<<"\nEl recorrido del arbol en PostOrden es: ";

recorridoPostOrden(arbol);

}
//Crear arbol

void insertarNodo(Nodo *&arbol, int n){

Nodo *nodoNuevo = new Nodo(); //Se crea el primer nodo

if(arbol == NULL){ //como el arbol esta vacio añade el nodo insertado como raiz (primer
nodo)

nodoNuevo->dato = n; //Le ingresa el dato al nodo creado

nodoNuevo->hijoDer = NULL; //Como es el primer nodo no tendra hijo derecho

nodoNuevo->hijoIzq = NULL; //Como es el primer nodo no tendra hijo izquierdo

arbol=nodoNuevo; //al ser el unico nodo el arbol sera solo la raiz y sus dos hijos
nulos

else{ //Significa que el arbol no esta vacio por lo que el nodo a ingresar se debe comparar
con el dato que esta en la raiz

int datoRaiz= arbol->dato; //tomamos el valor que esta en la raiz

if(n>datoRaiz){ //como ya tiene raiz, el dato insertado se compara con la raiz y si es


mayor es un hijo derecho

insertarNodo(arbol->hijoDer,n);

}else if(n<datoRaiz){

insertarNodo(arbol->hijoIzq,n); //Si es menor es porque es un hijo


izquierdo

}else{

cout<<"\nEl dato ya se encuentra ubicado en el arbol, digite otro."; //Si se


desea ingresar un dato que ya se encuentra en el arbol, pide por favor ingresar otro numero

void imprimirArbol(Nodo *arbol, int nivel){

if(arbol != NULL){ //Si se desea imprimir un arbol, este no debe ser vacio
imprimirArbol(arbol->hijoDer, nivel+1); //empieza a imprimir el el lado derecho del
arbol, los que son mayores a la raiz o nodo interno

for(int i=0;i<nivel;i++){ //va subiendo el nivel para imprimir los descendientes del
nodo anterio

cout<<" "; //los espacios equivalen a los enlaces entre nodos

cout<<arbol->dato<<endl; //imprime el dato del nodo actual

imprimirArbol(arbol->hijoIzq, nivel+1); //empieza a imprimir el lado izquierdo del


arbol

//Recorridos

void recorridoPreOrden(Nodo *arbol){

if(arbol != NULL){ //Si se desea recorrer el arbol, este no debe estar vacio

cout<<arbol->dato<<", "; //imprime primero la raiz / tambien se separa los datos


con comas

recorridoPreOrden(arbol->hijoIzq); //lo segundo que imprime son los hijos


izquierdos

recorridoPreOrden(arbol->hijoDer); //por ultimo imprime los hijos derechos

void recorridoInOrden(Nodo *arbol){

if(arbol != NULL){ //Si se desea recorrer el arbol, este no debe estar vacio

recorridoInOrden(arbol->hijoIzq); //se imprime primero los hijos

cout<<arbol->dato<<", ";

recorridoInOrden(arbol->hijoDer);

void recorridoPostOrden(Nodo *arbol){


if(arbol != NULL){ //Si se desea recorrer el arbol, este no debe estar vacio

recorridoPostOrden(arbol->hijoIzq);

recorridoPostOrden(arbol->hijoDer);

cout<<arbol->dato<<", ";

También podría gustarte