[CURSO] C++ DE 0 A HEROE 馃Ω

131.- C++ desde cero 2019 [Borrar un nodo con un solo sub谩rbol hijo]

En esta tutorial vamos a borrar los nodos que tengan un solo sub arbole (hijos) ya sea izquierdo o derecho.

Codigo: https://github.com/programadornovato/c-/commit/ebc38093ae2b9762dd8e0c62dd30b1519282341b

#include <iostream>
struct Nodo{
    int dato;
    Nodo *izq;
    Nodo *der;
    Nodo *padre;
};
Nodo *arbol=NULL;
Nodo *crearNodo(int dato,Nodo *padre);
void insertarNodo(Nodo *&arbol,int dato,Nodo *padre);
void mostrarArbol(Nodo *&arbol,int cont);
bool buscarNodoArbol(Nodo *&arbol,int numBuscar);
void preorden(Nodo *&arbol);
void inorden(Nodo *&arbol);
void postorden(Nodo *&arbol);
void buscarParaEliminar(Nodo *&arbol,int numeroEliminar);
void eliminarNodo(Nodo *&arbol);
Nodo *minimoNodo(Nodo *&arbol);
void remplazarNodo(Nodo *arbol,Nodo *nuevo);
void destruirNodo(Nodo *nodoDestruir);
void menu();
int main(){
    menu();
    system("pause");
    return 0;
}
void menu(){
    int opcion,dato;
    regresaMenu:
    system("cls");
    std::cout<<"\tMENU\n";
    std::cout<<"1.- Insertar un nodo\n";
    std::cout<<"2.- Mostrar arbol\n";
    std::cout<<"3.- Buscar un nodo en el arbol\n";
    std::cout<<"4.- Mostrar arbol en preorden\n";
    std::cout<<"5.- Mostrar arbol en inorden\n";
    std::cout<<"6.- Mostrar arbol en postorden\n";
    std::cout<<"7.- Ingresar datos de ejemplo\n";
    std::cout<<"8.- Eliminar nodo\n";
    std::cout<<"9.- Salir\n";
    std::cout<<"Humano ingresa una opcion:";
    std::cin>>opcion;
    switch (opcion)
    {
    case 1:
        std::cout<<"Ingresa el numero del nodo a insertar:";
        std::cin>>dato;
        insertarNodo(arbol,dato,NULL);
        system("pause");
        goto regresaMenu;
        break;
    case 2:
        std::cout<<"\n\tARBOL\n";
        mostrarArbol(arbol,0);
        std::cout<<"\n";
        system("pause");
        goto regresaMenu;
        break;
    case 3:
        std::cout<<"Ingrese el numero a buscar en el arbol:";
        std::cin>>dato;
        if(buscarNodoArbol(arbol,dato)==true){
            std::cout<<"El dato "<<dato<<" si se encontro en el arbol\n";
        }else{
            std::cout<<"El dato "<<dato<<" no se encontro en el arbol\n";
        }
        system("pause");
        goto regresaMenu;
        break;
    case 4: 
        std::cout<<"\t ARBOL EN PREORDEN\n";
        preorden(arbol);
        std::cout<<"\n";
        system("pause");
        goto regresaMenu;
        break;
    case 5:
        std::cout<<"\t ARBOL EN INORDEN\n";
        inorden(arbol);
        std::cout<<"\n";
        system("pause");
        goto regresaMenu;
        break;
    case 6:
        std::cout<<"\t ARBOL EN POSTORDEN\n";
        postorden(arbol);
        std::cout<<"\n";
        system("pause");
        goto regresaMenu;
        break;
    case 7:
        insertarNodo(arbol,10,NULL);
        insertarNodo(arbol,5,NULL);
        insertarNodo(arbol,3,NULL);
        insertarNodo(arbol,8,NULL);
        insertarNodo(arbol,6,NULL);
        insertarNodo(arbol,9,NULL);
        insertarNodo(arbol,7,NULL);
        insertarNodo(arbol,15,NULL);
        insertarNodo(arbol,12,NULL);
        insertarNodo(arbol,20,NULL);
        insertarNodo(arbol,30,NULL);
        system("pause");
        goto regresaMenu;
        break;
    case 8:
        std::cout<<"Humano ingresa el nodo a eliminar:";
        std::cin>>dato;
        buscarParaEliminar(arbol,dato);
        system("pause");
        goto regresaMenu;
        break;
    default:
        return;
        break;
    }
}
Nodo *crearNodo(int dato,Nodo *padre){
    Nodo *nuevoNodo=new Nodo();
    nuevoNodo->dato=dato;
    nuevoNodo->izq=NULL;
    nuevoNodo->der=NULL;
    nuevoNodo->padre=padre;
}
void insertarNodo(Nodo *&arbol,int dato,Nodo *padre){
    if(arbol==NULL){
        Nodo *nuevoNodo=crearNodo(dato,padre);
        arbol=nuevoNodo;
    }else{
        int valorRaiz=arbol->dato;
        if(dato<valorRaiz){
            insertarNodo(arbol->izq,dato,arbol);
        }else{
            insertarNodo(arbol->der,dato,arbol);
        }
    }
}
void mostrarArbol(Nodo *&arbol,int cont){
    if(arbol==NULL){
        return;
    }else{
        mostrarArbol(arbol->der,cont+1);
        for (int i = 0; i < cont; i++)
        {
            std::cout<<"       ";
        }
        std::cout<<arbol->dato<<"\n";
        mostrarArbol(arbol->izq,cont+1);
    }
}
bool buscarNodoArbol(Nodo *&arbol,int numBuscar){
    if(arbol==NULL){
        return false;
    }else if(arbol->dato==numBuscar){
        return true;
    }else if(numBuscar<arbol->dato){
        return buscarNodoArbol(arbol->izq,numBuscar);
    }else{
        return buscarNodoArbol(arbol->der,numBuscar);
    }
}
void preorden(Nodo *&arbol){
    if(arbol==NULL){
        return;
    }else{
        std::cout<<arbol->dato<<" - ";
        preorden(arbol->izq);
        preorden(arbol->der);
    }
}
void inorden(Nodo *&arbol){
    if(arbol==NULL){
        return;
    }else{
        inorden(arbol->izq);
        std::cout<<arbol->dato<<" - ";
        inorden(arbol->der);
    }
}
void postorden(Nodo *&arbol){
    if(arbol==NULL){
        return;
    }
    else{
        postorden(arbol->izq);
        postorden(arbol->der);
        std::cout<<arbol->dato<<" - ";
    }
}
void buscarParaEliminar(Nodo *&arbol,int numeroEliminar){
    if(arbol==NULL){
        return;
    }else if(numeroEliminar < arbol->dato){
        buscarParaEliminar(arbol->izq,numeroEliminar);
    }else if(numeroEliminar > arbol->dato){
        buscarParaEliminar(arbol->der,numeroEliminar);
    }else{
        eliminarNodo(arbol);
    }
}
void eliminarNodo(Nodo *&arbol){
    if(arbol->izq && arbol->der){
        Nodo *minimo=minimoNodo(arbol->der);
        arbol->dato=minimo->dato;
        eliminarNodo(minimo);
    }else if(arbol->izq){
        remplazarNodo(arbol,arbol->izq);
    }else if(arbol->der){
        remplazarNodo(arbol,arbol->der);
    }
}
void remplazarNodo(Nodo *arbol,Nodo *nuevo){
    if(arbol->padre){
        if(arbol->dato==arbol->padre->izq->dato){
            arbol->padre->izq=nuevo;
        }
        if(arbol->dato==arbol->padre->der->dato){
            arbol->padre->der=nuevo;
        }
    }
    if(nuevo){
        nuevo->padre=arbol->padre;
    }
    destruirNodo(arbol);
}
void destruirNodo(Nodo *nodoDestruir){
    nodoDestruir->izq=NULL;
    nodoDestruir->der=NULL;
    nodoDestruir->padre=NULL;
    delete nodoDestruir;
}
Nodo *minimoNodo(Nodo *&arbol){
    if(arbol==NULL){
        return NULL;
    }else if(arbol->izq){
        return minimoNodo(arbol->izq);
    }else{
        return arbol;
    }
}

馃帵 [Curso] Visual Studio Code 馃啔 de 0 a 100: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQbdlT8efsS-veXuvYZ1UWn

Gracias por apoyar este canal: https://www.patreon.com/programadornovato
馃敆 Facebook: https://facebook.com/ProgramadorNovatoOficial
馃敆 Twitter: https://twitter.com/programadornova
馃敆 Linkedin: https://www.linkedin.com/in/programadornovato/
馃敆 Instagram: https://www.instagram.com/programadornovato/
馃敆 Pagina oficial: https://www.programadornovato.com .
Descargar zip con todos los codigos: http://raboninco.com/bXZK
[CURSO] C++ DE 0 A HEROE: https://www.youtube.com/playlist?list=PLCTD_CpMeEKTofxs7iottRxJ5YPM7BOcc

Eugenio Chaparro

Entradas recientes

馃煝Editar c贸digo de un m贸dulo en Dolibarr [04]

馃煝Editar c贸digo de un m贸dulo en Dolibarr [04]

En este tutorial vamos editar el c贸digo de nuestro m贸dulo personas para poder personalizar algunas…

2 meses hace
馃煝Crear un sub_m贸dulo en Dolibarr [03]

馃煝Crear un sub_m贸dulo en Dolibarr [03]

En este tutorial vamos a crear un sub m贸dulo llamado seguridad que ser谩 muy parecido…

2 meses hace
馃煝Modificar un m贸dulo en Dolibarr [02]

馃煝Modificar un m贸dulo en Dolibarr [02]

En este tutorial aprenderemos a editar el objeto personas del modulo persona que creamos en…

2 meses hace
馃煝Constructor de m贸dulos en Dolibarr

馃煝Constructor de m贸dulos en Dolibarr

Como mencionamos anteriormente Dolibarr es un proyecto realizado sobre la base de una pol铆tica clara:…

2 meses hace
馃煝Tickets en Dolibarr [19]

馃煝Tickets en Dolibarr [19]

Los ticket en dolibarr nos ayudan a comunicar inconveniente en nuestros productos y servicios dentro…

2 meses hace
馃煝Agenda en Dolibarr [18]

馃煝Agenda en Dolibarr [18]

Las agendas en dolibarr nos ayudan a ver las actividades realizadas en proceso y por…

2 meses hace