Está en la página 1de 12

ÁRBOLES BINARIOS.

 Es una estructura ordenada de datos donde cada registro puede estar


relacionado con otros dos registros. Vamos a prestar especial atención a los
árboles binarios de búsqueda, ya que son muy populares y ampliamente
utilizados en BBDD. Como ya adelantaba en el post anterior, los arboles
binarios son de orden 2, es decir, sus nodos pueden tener un máximo de dos
hijos. Y si además es de búsqueda, tiene que cumplir las siguientes
condiciones para todos los nodos:

 Si el nodo tiene un hijo izquierdo, este tiene que ser menor que él.
 Si el nodo tiene un hijo derecho, este tiene que ser mayor que él.
ÁRBOL
BINARIO
¿Qué es un árbol binario de búsqueda?

 Es aquel que dado un nodo, todos los datos del subárbol izquierdo son menores, mientras que
todos los datos del subárbol derecho son mayores.
Operaciones que se realizaran en el siguiente
código de árboles binarios.

 Se realizaran las siguientes opciones:


 1.Insertar un nuevo Nodo
 2. Mostrar el árbol
 3.Altura del árbol
 4. Cantidad de Nodos en el árbol
 5.Eliminar el árbol
 6. Eliminar nodo del árbol
Crear NODO
Nodo *crearNodo(int n,Nodo *padre)
{
    Nodo *nuevo_nodo = new Nodo();

    nuevo_nodo->dato = n;
    nuevo_nodo->der = NULL;
    nuevo_nodo->izq = NULL;
    nuevo_nodo->padre=padre;//se le indica quien sera el padre

    return nuevo_nodo;
}
Insertar elementos en el árbol
void insertarNodo(Nodo *&arbol, int n,Nodo *padre)

if (arbol == NULL)

{ // si el arbol esta vacio

Nodo *nuevoNodo = crearNodo(n,padre);

arbol = nuevoNodo;

else

{ // si el arbol ya tiene nodos

int valorRaiz = arbol->dato;

if (n < valorRaiz)

{ // si el elemento es menor a la raiz insertamos en la izquierda

insertarNodo(arbol->izq, n,arbol);

else

{ // si el elemento es mayor a la raiz insertamos a la derecha

insertarNodo(arbol->der, n,arbol);

}
Mostrar árbol.
void mostrarArbol(Nodo *arbol, int contador)

if (arbol == NULL)

return;

else

mostrarArbol(arbol->der, contador + 1);

for (int iterador = 0; iterador < contador; iterador++)

cout << " ";

cout << arbol->dato<<endl;

mostrarArbol(arbol->izq, contador + 1);

}
Altura del árbol
int alturaArbol(Nodo *arbol){
    if (arbol!=NULL){
        int izquierda=alturaArbol(arbol->izq)+1;
        int derecha=alturaArbol(arbol->der)+1;
        if (izquierda>derecha){
            return izquierda;
        } else {
            return derecha;
        }
    }
    return -1;
}
Contar Nodos

int cantidadNodos(Nodo *arbol){


    if (arbol!=NULL){
        int izquierda=cantidadNodos(arbol->izq);
        int derecho=cantidadNodos(arbol->der);
        int medio=1;
        return izquierda+derecho+medio;
    }  
}
Reemplazar dos nodos
void reemplazar(Nodo *arbol, Nodo *nuevoNodo){
if(arbol->padre){
//arbol->hayq ue asignarle su nuevo hijo
if(arbol->dato==arbol->padre->izq->dato){
    arbol->padre->izq=nuevoNodo;
}
else if(arbol->dato==arbol->padre->der->dato){
    arbol->padre->der=nuevoNodo;
   }
}  
if(nuevoNodo){
//se le asigna su nuevo padre
    nuevoNodo->padre=arbol->padre;  
    }
}
Eliminar nodo encontrado
void eliminarNodo(Nodo *eliminaNodo){
    if(eliminaNodo->izq &&eliminaNodo->der){///si tiene ambos hijos
        Nodo *menor =minimo(eliminaNodo->der);
        eliminaNodo->dato=menor->dato;
        eliminarNodo(menor);
    }
    else if(eliminaNodo->izq){//un solo hijo
    reemplazar(eliminaNodo,eliminaNodo->izq);
    deleteNodo(eliminaNodo);    
    }
    else if(eliminaNodo->der){//un solo hijo
    reemplazar(eliminaNodo,eliminaNodo->der);
    deleteNodo(eliminaNodo);
    }else{///no tiene hijos es nodo hojas
    reemplazar(eliminaNodo,NULL);
    deleteNodo(eliminaNodo);
    }
}
Eliminar un nodo del árbol.
void eliminar(Nodo *arbol,int n){
    if(arbol==NULL){//si arbol esta vacio no hace nada
        return ;
     }else if(n<arbol->dato){//si es menor sabemos que es izquierda
        eliminar(arbol->izq,n);
     }else if(n>arbol->dato){//si es menor sabemos que es derecha
        eliminar(arbol->der,n);
 }else{///si encuentra el valor debe eliminar por medio de la funcion
    eliminarNodo(arbol);
    cout<<"se elimino el nodo"<<endl;
 }
 
}

También podría gustarte