Foros del Web » Programación para mayores de 30 ;) » C/C++ »

insertar un hijo en un determinado nodo en un arbol dinamico en c++

Estas en el tema de insertar un hijo en un determinado nodo en un arbol dinamico en c++ en el foro de C/C++ en Foros del Web. buenas noches comunidad , necesito su ayuda , estoy haciendo un arbol genealogico en c++ con el fin de darle un nombre de un nodo ...
  #1 (permalink)  
Antiguo 19/05/2016, 18:44
 
Fecha de Ingreso: mayo-2016
Mensajes: 6
Antigüedad: 8 años, 6 meses
Puntos: 0
insertar un hijo en un determinado nodo en un arbol dinamico en c++

buenas noches comunidad , necesito su ayuda , estoy haciendo un arbol genealogico en c++ con el fin de darle un nombre de un nodo al arbol y que devuelva cuales nodos son sus primos , mi problema es el siguiente , quiero hacer una funcion que al pasarle el arbol , el nombre de un nodo y otro elemento , la funcion me agregue el elemento como un hijo de ese nodo , mi implementacion consta de una funcion localizar_nodo que me busca el nodo y me lo devuelve , esa funcion se llama en la funcion insertar nodo , mi problema es que me devuelve otro nodo diferente al buscado , agrego el codigo para que tengan una referencia , el arbol es un arbol binario

Código C++:
Ver original
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct ABB
  8. {
  9.    int elem;
  10.    ABB *der, *izq;
  11. } ABB;
  12.  
  13. ABB* crear_nodo()
  14. {
  15.    ABB *p;
  16.    p = new ABB;
  17.    if(p)
  18.    {
  19.       p->elem = 0;
  20.       p->izq = NULL;
  21.       p->der = NULL;
  22.    }
  23.    return p;
  24. }
  25.  
  26. bool agregar_nodo(ABB* &p, int n)
  27. {
  28.    ABB *q, *aux;
  29.    bool found;
  30.    
  31.    q = crear_nodo();
  32.    
  33.    if(q == NULL) return false;
  34.  
  35.    q->elem = n;
  36.    
  37.    if(p==NULL)
  38.    {
  39.      p = q;
  40.      return true;
  41.    }
  42.    
  43.    aux = p;
  44.  
  45.    found = false;
  46.  
  47.    while(!found)
  48.    {
  49.        if(q->elem <= aux->elem)
  50.        {  
  51.            if(aux->izq==NULL)
  52.            {  
  53.               aux->izq = q;
  54.               found = true;
  55.            }
  56.            else
  57.               aux = aux->izq;
  58.        }
  59.        else
  60.        {
  61.            if(aux->der==NULL)
  62.            {
  63.               aux->der = q;
  64.               found = true;
  65.            }
  66.            else
  67.              aux = aux->der;
  68.        }
  69.    }
  70.    return true;
  71. }
  72.  
  73. bool es_hoja(ABB *p)
  74. {
  75.     return (p->izq==NULL && p->der==NULL);
  76. }
  77.  
  78.  
  79. void inorden(ABB *p)
  80. {
  81.    if(p==NULL) return;
  82.    
  83.    inorden(p->izq);
  84.    cout << p->elem << "  ";
  85.    inorden(p->der);
  86.    
  87.    return;
  88. }
  89.  
  90. void pre_orden(ABB* &abb){
  91.     if(abb==NULL) return;
  92.     pre_orden(abb->izq);
  93.     pre_orden(abb->der);
  94.     cout << setw(4) << abb->elem;
  95. }
  96.  
  97. void en_orden(ABB* &abb){
  98.     if(abb==NULL) return;
  99.     en_orden(abb->izq);
  100.     cout << setw(4) << abb->elem;
  101.     en_orden(abb->der);
  102. }
  103.  
  104. void post_orden(ABB* &abb){
  105.     if(abb==NULL) return;
  106.     post_orden(abb->der);
  107.     post_orden(abb->izq);
  108.     cout << setw(4) << abb->elem;      
  109. }
  110.  
  111.  
  112. bool borrar(ABB* &p, int dat)
  113. {
  114.     if(p==NULL) return false;
  115.    
  116.     ABB *actual = p;
  117.     ABB *padre  = NULL;
  118.     ABB *aux    = NULL;
  119.    
  120.     while(actual!=NULL)
  121.     {
  122.         if(actual->elem == dat)
  123.         {
  124.             if(es_hoja(actual)) // Si es una hoja
  125.             {
  126.                 cout << "Es una hoja!" << endl;
  127.                 // Si provenimos de una rama
  128.                 if(padre!=NULL) // Borramos la referencia a la hoja
  129.                 {
  130.                     if(dat > padre->elem) padre->der = NULL; // Si estamos por la derecha
  131.                     else                  padre->izq = NULL; // Si estamos por la izquierda
  132.                 }
  133.                 delete actual; // Borramos la hoja
  134.                 return true;
  135.             }
  136.             else
  137.             {
  138.                 cout << "No es una hoja..." << endl;
  139.                 // En su lugar buscamos el nodo más a la izquierda del subárbol derecho,
  140.                 // o el más a la derecha del subárbol izquierdo e intercambiamos sus valores.
  141.                 // A continuación eliminamos el nodo hoja.
  142.                 aux = actual;
  143.                 padre = actual;
  144.                 if(aux->der!=NULL)
  145.                 {          
  146.                     aux = actual->der; 
  147.                     while(aux->izq!=NULL)
  148.                     {
  149.                         padre = aux;
  150.                         aux = aux->izq;
  151.                     }
  152.                     if(actual!=padre) padre->izq = NULL;
  153.                     else padre->der = NULL;
  154.                 }
  155.                 else if(aux->izq!=NULL)
  156.                 {          
  157.                     aux = actual->izq;     
  158.                     while(aux->der!=NULL)
  159.                     {
  160.                         padre = aux;
  161.                         aux = aux->der;
  162.                     }
  163.                     if(actual!=padre) padre->der = NULL;
  164.                     else padre->izq = NULL;
  165.                 }
  166.                 actual->elem = aux->elem;
  167.                 delete aux;
  168.                 actual = NULL;
  169.                 return true;
  170.             }
  171.         }
  172.         else
  173.         {
  174.             padre = actual;
  175.             if(dat > actual->elem) actual = actual->der;
  176.             else                   actual = actual->izq;
  177.         }      
  178.     }
  179.    
  180.     return false;
  181. }
  182.  
  183. int CantNivel(ABB *arbol,int nivel)
  184. {
  185.    if(arbol==NULL)
  186.      return 0;
  187.    else if(nivel==0)
  188.      return 1;
  189.    else
  190.      return(CantNivel(arbol->izq,nivel-1) + CantNivel(arbol->der,nivel-1));      
  191. }
  192.  
  193.  
  194. ABB* buscar(ABB* &abb, int dat){
  195.     if(abb == NULL){
  196.         return false;
  197.     }
  198.    
  199.     if(abb->elem == dat){
  200.         return abb;
  201.     }
  202.     else {
  203.         (buscar(abb->izq, dat) || buscar(abb->der, dat));
  204.     }    
  205. }
  206.  
  207. int nivel_elemt(ABB* &abb, int dat){
  208.     if(abb == NULL){
  209.         return false;
  210.     }
  211.    
  212.     if(abb->elem == dat){
  213.         return true;
  214.     }
  215.     else {
  216.         return (buscar(abb->izq, dat) || buscar(abb->der, dat));
  217.     }    
  218. }
  219.  
  220. int EstaenArbol(ABB *arbol,int elem)
  221. {
  222.    if(arbol==NULL)    
  223.      return 0;
  224.    
  225.    else if(elem == arbol->elem)
  226.      return 1;
  227.      
  228.    else
  229.      return(EstaenArbol(arbol->izq,elem) || EstaenArbol(arbol->der,elem));
  230. }
  231.  
  232. int nivel(ABB *arbol, int num)
  233. {
  234.    if(arbol==NULL)
  235.      return -1;
  236.    else if(arbol->elem == num)
  237.      return 0;
  238.    else if(EstaenArbol(arbol->izq,num))  
  239.      return nivel(arbol->izq,num) +1;
  240.    else if(EstaenArbol(arbol->der,num))  
  241.      return nivel(arbol->der,num) +1;
  242.    else return -1;
  243.  
  244. }
  245.  
  246. ABB* localizar_nodo(int dat,ABB* &abb){
  247.  
  248.     if(abb != NULL) {
  249.    
  250.         localizar_nodo(dat,abb->izq);
  251.         localizar_nodo(dat,abb->der);
  252.        
  253.         if (abb->elem == dat){
  254.             return abb;    
  255.         }
  256.    
  257.     }
  258. }
  259.  
  260. void inserta_hijo_en_nodo(ABB *arbol,int dato_nodo,int nuevo_elem)
  261. {
  262.     ABB *nuevo;
  263.     ABB *nodo;
  264.    
  265.     nodo = localizar_nodo( dato_nodo , arbol);
  266.    
  267.     //Esta es una salida de prueba aqui es donde me doy cuenta que el nodo es
  268.     //diferente al buscado
  269.    
  270.     cout<<"El elemnto en el nodo es"<<nodo->elem<<endl;
  271.    
  272.     nuevo = crear_nodo();
  273.     nuevo->elem = nuevo_elem;
  274.    
  275.     nodo->izq = nuevo;        
  276. }
  277.  
  278.  
  279.  
  280. int main()
  281. {
  282.   ABB *p;
  283.   p = NULL;
  284.  
  285.   agregar_nodo(p, 8);
  286.   agregar_nodo(p, 2);
  287.   agregar_nodo(p, 9);
  288.   agregar_nodo(p, 4);
  289.   agregar_nodo(p, 1);
  290.   agregar_nodo(p, 3);
  291.  
  292.   inserta_hijo_en_nodo(p,9,7);
  293.   /*
  294.   agregar_nodo(p, 7);
  295.   agregar_nodo(p,10);
  296.   agregar_nodo(p,11);
  297.   agregar_nodo(p,12);
  298.   agregar_nodo(p,14);
  299.   agregar_nodo(p,15);
  300.   agregar_nodo(p,16);
  301.   */
  302.   //+++++++++++++++++++++++++++++++++++
  303.   //Estas son unas pruebas para ver si el hijo de 9 es 7
  304.   //cout<<"Primer nodo->"<<p->elem<<endl;
  305.   //cout<<"A su izquierda->"<<p->izq->elem<<endl;
  306.   //cout<<"A su derecha ->"<<p->der->izq->elem<<endl;
  307.   //+++++++++++++++++++++++++++++++++
  308.  
  309.   //buscar(p, 4);
  310.  
  311.   //cout<<"el elemento esta en el nivel"<<nivel(p,3)<<endl;  
  312.  
  313.   //cout<<"elementos en el nivel :"<<CantNivel(p,3)<<endl;
  314.  
  315.   system("pause");
  316.   return 0;
  317. }

muchas gracias de antemano
  #2 (permalink)  
Antiguo 19/05/2016, 20:05
 
Fecha de Ingreso: mayo-2016
Mensajes: 6
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: insertar un hijo en un determinado nodo en un arbol dinamico en c++

haciendo pruebas descubri que en la funcion inserta_hijo_en_nodo en la linea que hago
Código C++:
Ver original
  1. nodo = localizar_nodo( dato_nodo , arbol);
por alguna razon no se estan pasando los datos del nodo encontrado , actualmente las funciones son estas

Código C++:
Ver original
  1. ABB* localizar_nodo(int dat,ABB* abb){
  2.  
  3.     ABB* copia_arbol = NULL;
  4.     copia_arbol = abb;
  5.  
  6.     if(copia_arbol != NULL) {
  7.    
  8.         cout<<"elemento "<<copia_arbol->elem<<endl;  
  9.         if (copia_arbol->elem == dat){
  10.             cout<<"elemento retornado:"<<copia_arbol->elem<<endl;
  11.             return copia_arbol;    
  12.         }else{  
  13.    
  14.             localizar_nodo(dat,copia_arbol->izq);
  15.             localizar_nodo(dat,copia_arbol->der);
  16.         }
  17.        
  18.        
  19.    
  20.     }
  21. }

y la que inserta el nodo

Código C++:
Ver original
  1. void inserta_hijo_en_nodo(ABB *arbol,int dato_nodo,int nuevo_elem)
  2. {
  3.     ABB *nuevo;
  4.     ABB *nodo;
  5.    
  6.     nodo = localizar_nodo( dato_nodo , arbol);
  7.    
  8.     //Esta es una salida de prueba aqui es donde me doy cuenta que el nodo es
  9.     //diferente al buscado
  10.    
  11.     cout<<"El elemento en el nodo es "<<&nodo->elem<<endl;
  12.    
  13.     nuevo = crear_nodo();
  14.     nuevo->elem = nuevo_elem;
  15.    
  16.     //nodo->izq = nuevo;        
  17. }
  #3 (permalink)  
Antiguo 19/05/2016, 21:03
 
Fecha de Ingreso: mayo-2016
Mensajes: 6
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: insertar un hijo en un determinado nodo en un arbol dinamico en c++

Al final resolvi haciendo esto

Código C++:
Ver original
  1. void localizar_nodo(int dat,ABB* abb,ABB* &nodo_localizado){
  2.  
  3.     ABB* copia_arbol = NULL ;
  4.     ABB* nodo_encontrado = NULL;
  5.     copia_arbol = abb;
  6.    
  7.    
  8.     nodo_encontrado = copia_arbol;
  9.     nodo_localizado = copia_arbol;
  10.  
  11.     if(copia_arbol != NULL) {
  12.        
  13.         if (copia_arbol->elem == dat){
  14.            
  15.             //Copiamos el nodo encontrado
  16.             nodo_encontrado = copia_arbol;
  17.    
  18.         }else{  
  19.    
  20.             localizar_nodo(dat,copia_arbol->izq,nodo_localizado);
  21.             localizar_nodo(dat,copia_arbol->der,nodo_localizado);
  22.         }
  23.    
  24.     }
  25.    
  26. }

Código C++:
Ver original
  1. void inserta_hijo_en_nodo(ABB *arbol,int dato_nodo,int nuevo_elem)
  2. {
  3.     ABB *nuevo;
  4.     ABB *nodo_objetivo;
  5.  
  6.    
  7.     localizar_nodo( dato_nodo , arbol , nodo_objetivo);
  8.    
  9.     //Esta es una salida de prueba aqui es donde me doy cuenta que el nodo es
  10.     //diferente al buscado
  11.    
  12.     cout<<"El elemento en el nodo es "<<nodo_objetivo->elem<<endl;
  13.    
  14.     nuevo = crear_nodo();
  15.     nuevo->elem = nuevo_elem;
  16.    
  17.     nodo_objetivo->izq = nuevo;        
  18. }

ya hace lo que queria , el cambio radica que la funcion que localiza el nodo ya no lo retorna sino que en los parametros le paso una variabel ABB* & nodo_encontrado
en esta grabo el nodo y posteriormente lo uso , nose porque retornando no funciona , lo unico que se me ocurre es que las funciones retornan cosas por defecto y esos retornos se juntaban con el retorno resultado y lo dañaba , si alguien me puede explicar eso se lo agradeceria un monton

Etiquetas: arboles, ayuda!!, c++, ejercicios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:20.