Código C++:
Ver original
#include <iostream> #include <iomanip> #include <cstdlib> using namespace std; typedef struct ABB { int elem; ABB *der, *izq; } ABB; ABB* crear_nodo() { ABB *p; p = new ABB; if(p) { p->elem = 0; p->izq = NULL; p->der = NULL; } return p; } bool agregar_nodo(ABB* &p, int n) { ABB *q, *aux; bool found; q = crear_nodo(); if(q == NULL) return false; q->elem = n; if(p==NULL) { p = q; return true; } aux = p; found = false; while(!found) { if(q->elem <= aux->elem) { if(aux->izq==NULL) { aux->izq = q; found = true; } else aux = aux->izq; } else { if(aux->der==NULL) { aux->der = q; found = true; } else aux = aux->der; } } return true; } bool es_hoja(ABB *p) { return (p->izq==NULL && p->der==NULL); } void inorden(ABB *p) { if(p==NULL) return; inorden(p->izq); cout << p->elem << " "; inorden(p->der); return; } void pre_orden(ABB* &abb){ if(abb==NULL) return; pre_orden(abb->izq); pre_orden(abb->der); cout << setw(4) << abb->elem; } void en_orden(ABB* &abb){ if(abb==NULL) return; en_orden(abb->izq); cout << setw(4) << abb->elem; en_orden(abb->der); } void post_orden(ABB* &abb){ if(abb==NULL) return; post_orden(abb->der); post_orden(abb->izq); cout << setw(4) << abb->elem; } bool borrar(ABB* &p, int dat) { if(p==NULL) return false; ABB *actual = p; ABB *padre = NULL; ABB *aux = NULL; while(actual!=NULL) { if(actual->elem == dat) { if(es_hoja(actual)) // Si es una hoja { cout << "Es una hoja!" << endl; // Si provenimos de una rama if(padre!=NULL) // Borramos la referencia a la hoja { if(dat > padre->elem) padre->der = NULL; // Si estamos por la derecha else padre->izq = NULL; // Si estamos por la izquierda } delete actual; // Borramos la hoja return true; } else { cout << "No es una hoja..." << endl; // En su lugar buscamos el nodo más a la izquierda del subárbol derecho, // o el más a la derecha del subárbol izquierdo e intercambiamos sus valores. // A continuación eliminamos el nodo hoja. aux = actual; padre = actual; if(aux->der!=NULL) { aux = actual->der; while(aux->izq!=NULL) { padre = aux; aux = aux->izq; } if(actual!=padre) padre->izq = NULL; else padre->der = NULL; } else if(aux->izq!=NULL) { aux = actual->izq; while(aux->der!=NULL) { padre = aux; aux = aux->der; } if(actual!=padre) padre->der = NULL; else padre->izq = NULL; } actual->elem = aux->elem; delete aux; actual = NULL; return true; } } else { padre = actual; if(dat > actual->elem) actual = actual->der; else actual = actual->izq; } } return false; } int CantNivel(ABB *arbol,int nivel) { if(arbol==NULL) return 0; else if(nivel==0) return 1; else return(CantNivel(arbol->izq,nivel-1) + CantNivel(arbol->der,nivel-1)); } ABB* buscar(ABB* &abb, int dat){ if(abb == NULL){ return false; } if(abb->elem == dat){ return abb; } else { (buscar(abb->izq, dat) || buscar(abb->der, dat)); } } int nivel_elemt(ABB* &abb, int dat){ if(abb == NULL){ return false; } if(abb->elem == dat){ return true; } else { return (buscar(abb->izq, dat) || buscar(abb->der, dat)); } } int EstaenArbol(ABB *arbol,int elem) { if(arbol==NULL) return 0; else if(elem == arbol->elem) return 1; else return(EstaenArbol(arbol->izq,elem) || EstaenArbol(arbol->der,elem)); } int nivel(ABB *arbol, int num) { if(arbol==NULL) return -1; else if(arbol->elem == num) return 0; else if(EstaenArbol(arbol->izq,num)) return nivel(arbol->izq,num) +1; else if(EstaenArbol(arbol->der,num)) return nivel(arbol->der,num) +1; else return -1; } ABB* localizar_nodo(int dat,ABB* &abb){ if(abb != NULL) { localizar_nodo(dat,abb->izq); localizar_nodo(dat,abb->der); if (abb->elem == dat){ return abb; } } } void inserta_hijo_en_nodo(ABB *arbol,int dato_nodo,int nuevo_elem) { ABB *nuevo; ABB *nodo; nodo = localizar_nodo( dato_nodo , arbol); //Esta es una salida de prueba aqui es donde me doy cuenta que el nodo es //diferente al buscado cout<<"El elemnto en el nodo es"<<nodo->elem<<endl; nuevo = crear_nodo(); nuevo->elem = nuevo_elem; nodo->izq = nuevo; } int main() { ABB *p; p = NULL; agregar_nodo(p, 8); agregar_nodo(p, 2); agregar_nodo(p, 9); agregar_nodo(p, 4); agregar_nodo(p, 1); agregar_nodo(p, 3); inserta_hijo_en_nodo(p,9,7); /* agregar_nodo(p, 7); agregar_nodo(p,10); agregar_nodo(p,11); agregar_nodo(p,12); agregar_nodo(p,14); agregar_nodo(p,15); agregar_nodo(p,16); */ //+++++++++++++++++++++++++++++++++++ //Estas son unas pruebas para ver si el hijo de 9 es 7 //cout<<"Primer nodo->"<<p->elem<<endl; //cout<<"A su izquierda->"<<p->izq->elem<<endl; //cout<<"A su derecha ->"<<p->der->izq->elem<<endl; //+++++++++++++++++++++++++++++++++ //buscar(p, 4); //cout<<"el elemento esta en el nivel"<<nivel(p,3)<<endl; //cout<<"elementos en el nivel :"<<CantNivel(p,3)<<endl; return 0; }
muchas gracias de antemano