elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  eliminar ancestros de hojas arbol binario c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: eliminar ancestros de hojas arbol binario c++  (Leído 6,785 veces)
Lain SEL

Desconectado Desconectado

Mensajes: 3


Ver Perfil
eliminar ancestros de hojas arbol binario c++
« en: 15 Agosto 2010, 20:47 pm »

Hola, estoy teniendo problemas a la hora de implementar ese método...
Se supone que tengo un arbol por ejemplo

                  50
        40               70

 35                    65

se supone que si aplico el método, el arbol quedaría así:

             50
      35        65

estaba intentando hacer algo así

hacer un método que sacara los ancestros:

Código
  1.  TNodoABB *Arbol::ancestros(TNodoABB *arbol,int d)
  2. {
  3. TNodoABB *x;
  4.  if(arbol!=NULL)
  5.  {
  6.      if(d < arbol->getInfo())
  7.          x = ancestros(arbol->getIzq(),d);
  8.      else if(d>arbol->getInfo())
  9.          x = ancestros(arbol->getDer(),d);
  10.  
  11.      return x;
  12.  }
  13.  else return NULL;
  14. }
  15.  
  16.  
  17. ya lo probé y sí funciona luego cuando hago el eliminar se me cae :P ...
  18.  
  19. este es uno de mis intentos
  20.  
  21. bool Arbol::EliminarAncestros(TNodoABB *&A){
  22.    if( A == NULL)
  23.        return false;
  24.    else
  25.        if(Hoja(A) != NULL)
  26.           return EliminarNodo(ancestros(Hoja(A),Hoja(A)->getInfo()));
  27.        else
  28.        {
  29.        EliminarAncestros(Hoja(A->getIzq()));
  30.        EliminarAncestros(Hoja(A->getDer()));
  31.        return true;
  32.        }
  33.  
  34. }

x.x pero aún no lo logro....

si alguien fuese tan amable de darme una luz acerca de como hacerlo se lo agradecería  :-*


Lh: No hagas doble post, utiliza el botón modificar. Utiliza la etiqueta GeSHi para poner código.


ya lo logré :D
wiiiii jijiji  ;D
acá les dejó el código para cuando alguien lo ocupe :)

Código
  1. bool Arbol::EliminarAncestros(TNodoABB *&A){
  2.    TNodoABB *aux;
  3.    int dato;
  4.  
  5.      if(A->getIzq() == NULL && A->getDer() != NULL && A->getDer()->getDer() == NULL) //si no tiene descendencia izquierda
  6.      {                       //apunto al nodo a eliminar
  7.        aux = A;              //redefino el arbol sin nodo a eliminar
  8.        A = A->getDer();
  9.        delete aux;
  10.        return true;
  11.      }
  12.      else
  13.      {
  14.        if(A->getDer() == NULL && A->getIzq()->getIzq() == NULL) //tiene no tiene descendencia derecha
  15.        {
  16.            aux = A;
  17.            A = A->getIzq();
  18.            delete aux;
  19.            return true;
  20.        }
  21.        else{//el nodo tiene dos descendencias
  22.        if(A->getDer()->getDer() == NULL &&  A->getIzq()->getIzq() == NULL){
  23.         dato = Mayor(A->getIzq());
  24.         A->setInfo(dato);
  25.         return Eliminar(dato, A->getIzq());
  26.         }
  27.  
  28.         else{
  29.          EliminarAncestros(A->getIzq());
  30.          EliminarAncestros(A->getDer());
  31.          return true;
  32.         }
  33.      }
  34.  
  35.      }
  36.  
  37.  
  38.  
  39. }


gracias :D .. lo tomaré en cuenta :)


« Última modificación: 16 Agosto 2010, 00:10 am por Lain SEL » En línea

Tha_Traker

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: eliminar ancestros de hojas arbol binario c++
« Respuesta #1 en: 17 Agosto 2010, 00:35 am »

Por si te interesa esto es un programita de manejo básico de arboles binarios. Es una chorrada pero esta bien para entender el manejo y la estructura.

En mi humilde opinión, me parece que eso de poner 8 return es un desfase. Mucho más facil es usar un doble puntero, porque esa función es pequeña pero me pones una fucnión de 300 lineas con 20 return y ni me leo el código. Algnos diran que soy un purista pesado, pero digo yo que si se creo la programación estructurada no sería para decorar o por aburrimiento.
Otra cosa es que los // o /* */ sirve para poner comentarios, una cosa que la gente agradece cuando el programa no es suyo.

Un saludo

Código
  1. //Cabeceres de precompilación o librerias
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. //Estructuras globales
  7. typedef struct arbol{
  8. char DNI[10];
  9. char Nombre[20];
  10. float nota;
  11. struct arbol *izq;
  12. struct arbol *der;
  13. }T_ARBOL;
  14.  
  15.  
  16.  
  17.  
  18. //Funciones
  19. void Menu (int *op);
  20. void Crear_nodo (T_ARBOL **nodo,T_ARBOL Dato);
  21. void Insertar_nodo (T_ARBOL **nodo,T_ARBOL Dato);
  22. void Limpiar_cadena (char *cadena, int n);
  23. void visualizar (T_ARBOL *nodo);
  24. void preorden (T_ARBOL *nodo);
  25. void inorden (T_ARBOL *nodo);
  26. void postorden (T_ARBOL *nodo);
  27. T_ARBOL *Buscar(T_ARBOL *nodo,char *clave,T_ARBOL **POS);
  28. void Eliminar_nodo (T_ARBOL **nodo,char *clave);
  29. void Desconectar12 (T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD);
  30. void Desconectar3 (T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD);
  31.  
  32. /*************************************************
  33. ********************PRINCIPAL*********************
  34. *************************************************/
  35. int main(void)
  36. {
  37. //ENTORNO
  38. int op;
  39. T_ARBOL *raiz;
  40. T_ARBOL Info;
  41. char clave[20];
  42.  
  43. //INICIALIZACIONES
  44. raiz=NULL;
  45. op=0;
  46.  
  47. //ALGORITMO
  48.  
  49. system("title Practica 8: Arboles");
  50.  
  51.  
  52. do{
  53. printf("\n ");
  54. system("pause");
  55. system("cls");
  56. Menu(&op);
  57.  
  58. system("cls");
  59.  
  60. switch(op)
  61. {
  62. case 1://Introducir alumno
  63. printf("\t\n Nombre: ");
  64. fflush(stdin);    
  65. fgets(Info.Nombre,20,stdin);
  66. Limpiar_cadena(Info.Nombre,20);
  67. printf("\t\n DNI: ");
  68. fflush(stdin);    
  69. fgets(Info.DNI,10,stdin);
  70. Limpiar_cadena(Info.DNI,10);
  71. printf("\t\n Nota: ");
  72. scanf("%f",&Info.nota);
  73.  
  74.  
  75. Insertar_nodo(&raiz,Info);
  76.  
  77.  
  78. break;
  79. case 2://Eliminar alumno
  80.  
  81. if(raiz!=NULL)
  82. {
  83. printf("\t\n Introduzca el nombre del alumno a borrar: ");
  84. fflush(stdin);    
  85. fgets(clave,20,stdin);
  86. Limpiar_cadena(clave,20);
  87.  
  88. Eliminar_nodo(&raiz,clave);
  89. }
  90. else
  91. {
  92. printf("\t\n El arbol est%c vac%co",160,161);
  93. }
  94.  
  95.  
  96. break;
  97. case 3://Preorden
  98. if(raiz!=NULL)
  99. {
  100. preorden(raiz);
  101. }
  102. else
  103. {
  104. printf("\t\n El arbol est%c vac%co",160,161);
  105. }
  106. break;
  107. case 4://Inorden
  108. if(raiz!=NULL)
  109. {
  110. inorden(raiz);
  111. }
  112. else
  113. {
  114. printf("\t\n El arbol est%c vac%co",160,161);
  115. }
  116. break;
  117. case 5://Postorden
  118. if(raiz!=NULL)
  119. {
  120. postorden(raiz);
  121. }
  122. else
  123. {
  124. printf("\t\n El arbol est%c vac%co",160,161);
  125. }
  126. break;
  127. case 6://Salir
  128. printf("\t\n Gracias por usar este programa ");
  129.  
  130. break;
  131.  
  132. }//Fin Switch
  133. }while(op!=6);
  134.  
  135. // Valor devuelto por el programa en caso de funcionamiento correcto.
  136. return(0);
  137. }
  138. /*************************************************
  139. ********************FUNCIONES ********************
  140. *************************************************/
  141. void Menu(int *op)
  142. {
  143. do{
  144. printf("\t\n  *** GESTI%cN DE NOTAS DE ALUMNOS ",162);
  145. printf("\t\n1.A%cadir alumno(nodo) ",164);
  146. printf("\t\n2.Eliminar alumno(nodo) ");
  147. printf("\t\n3.Mostrar datos de alumnos en preorden ");
  148. printf("\t\n4.Mostrar datos de alumnos en inorden ");
  149. printf("\t\n5.Mostrar datos de alumnos en posorden ");
  150. printf("\t\n6.Salir ");
  151. printf("\t\n     Opci%cn: ",162);
  152. scanf("%d",&*op);
  153. }while(*op>6);
  154.  
  155. return;
  156. }
  157.  
  158.  
  159.  
  160. //CREACIÓN DE UN NODO
  161.  
  162. void Crear_nodo(T_ARBOL **nodo,T_ARBOL Dato)
  163. {
  164. //ENTORNO
  165.  
  166. //ALGORITMO
  167.  
  168. //Pedir memoria
  169. (*nodo)=(T_ARBOL*)calloc(1,sizeof(T_ARBOL));
  170. if((*nodo)==NULL)//Control de errores
  171. {
  172. printf("\n\t Error al pedir memoria ");
  173. }
  174. else
  175. {
  176.  
  177. //Copiar datos al elemento
  178. strcpy((*nodo)->Nombre,Dato.Nombre);
  179. strcpy((*nodo)->DNI,Dato.DNI);
  180. (*nodo)->nota=Dato.nota;
  181.  
  182. //Crearmos los punteros a futuros hijos
  183. (*nodo)->izq=NULL;
  184. (*nodo)->der=NULL;
  185.  
  186.  
  187. }
  188. return;
  189. }
  190.  
  191. //INSERTAR RECURSIVA
  192.  
  193. void Insertar_nodo(T_ARBOL **nodo,T_ARBOL Dato)
  194. {
  195.  
  196. if(*nodo==NULL)
  197. {
  198. Crear_nodo(&(*nodo),Dato);
  199.  
  200. }
  201. else
  202. {
  203. if(strcmp((*nodo)->Nombre,Dato.Nombre)==0)
  204. {
  205. printf("\t\n El elemento ya existe ");
  206. }
  207. else
  208. {
  209. if(strcmp((*nodo)->Nombre,Dato.Nombre)>0)//Izquierda
  210. {
  211. Insertar_nodo(&(*nodo)->izq,Dato);
  212. }
  213. else//Derecha
  214. {
  215. Insertar_nodo(&(*nodo)->der,Dato);
  216. }
  217. }
  218. }
  219. return;
  220. }
  221.  
  222. void visualizar(T_ARBOL *nodo)
  223. {
  224. printf("\t\n ");
  225. printf(" Nombre: ");
  226. puts(nodo->Nombre);
  227. printf(" DNI: ");
  228. puts(nodo->DNI);
  229. printf(" Nota: %f ",nodo->nota);
  230. printf("\t\n ");
  231. return;
  232. }
  233.  
  234. void preorden(T_ARBOL *nodo)
  235. {
  236.  if (nodo != NULL) {
  237.    visualizar(nodo);
  238.    preorden(nodo->izq);
  239.    preorden(nodo->der);
  240.  }
  241. }
  242.  
  243. void inorden(T_ARBOL *nodo)
  244. {
  245.  if (nodo != NULL) {
  246.    inorden(nodo->izq);
  247.    visualizar(nodo);
  248.    inorden(nodo->der);
  249.  }
  250. }
  251.  
  252. void postorden(T_ARBOL *nodo)
  253. {
  254.  if (nodo != NULL) {
  255.    postorden(nodo->izq);
  256.    postorden(nodo->der);
  257.    visualizar(nodo);
  258.  }
  259. }
  260.  
  261.  
  262.  
  263. T_ARBOL *Buscar(T_ARBOL *nodo,char *clave,T_ARBOL **PAD)
  264. {
  265. //ENTORNO
  266. T_ARBOL *POS;
  267. int sw;
  268.  
  269.  
  270. //INICIALIZACIONES
  271. POS=nodo;
  272. PAD=NULL;
  273. sw=0;
  274. //ALGORITMO
  275. while(sw!=1 && POS!=NULL)
  276. {
  277. //Encontrado
  278. if(strcmp(POS->Nombre,clave)==0)
  279. {
  280. sw=1;
  281. }
  282. //Seguimos buscando
  283. else
  284. {
  285. (*PAD)=POS;
  286. if(strcmp(POS->Nombre,clave)<0)
  287. POS=POS->der;
  288. else
  289. POS=POS->izq;
  290. }
  291. }
  292.  
  293. return(POS);
  294. }
  295.  
  296.  
  297. void Eliminar_nodo(T_ARBOL **nodo,char *clave)
  298. {
  299. T_ARBOL *PAD;
  300. T_ARBOL *POS;
  301.  
  302. //Buscar el elemento a borrar
  303. POS=Buscar((*nodo),clave,&PAD);
  304. if(POS==NULL)
  305. printf("\n No encontrado");
  306. else
  307. {
  308. //En caso de que tenga 2 hijos
  309. if(POS->izq!=NULL && POS->der!=NULL)
  310. {
  311. Desconectar3(&(*nodo),POS,&PAD);
  312. }
  313. //Si no tiene o solo tiene 1 hijo.
  314. else
  315. {
  316. Desconectar12(&(*nodo),POS,&PAD);
  317. }
  318. //Liberamos la memoria
  319. free(POS);
  320. }
  321. return;
  322. }
  323.  
  324. void Desconectar12(T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD)
  325. {
  326.  
  327. T_ARBOL *HIJO;
  328.  
  329. //No tiene hijos
  330. if(POS->izq==NULL && POS->der==NULL)
  331. {
  332. HIJO=NULL;
  333. }
  334. //Tiene 1 hijo
  335. else
  336. {
  337. if(POS->izq==NULL)
  338. HIJO=POS->der;
  339. else
  340. HIJO=POS->izq;
  341. }
  342. //El nodo a eliminar es la raiz
  343. if((*PAD)==NULL)
  344. {
  345. *nodo=HIJO;
  346. }
  347. else
  348. {
  349. if(POS==(*PAD)->izq)//ERROR
  350. (*PAD)->izq=HIJO;
  351. else
  352. (*PAD)->der=HIJO;
  353.  
  354. }
  355.  
  356.  
  357.  
  358. return;
  359. }
  360.  
  361. void Desconectar3(T_ARBOL **nodo,T_ARBOL *POS,T_ARBOL **PAD)
  362. {
  363. //ENTORNO
  364. T_ARBOL *SIG;
  365. T_ARBOL *PADSIG;
  366.  
  367. //INICIALIZACIONES
  368. PADSIG=POS;
  369. SIG=POS->der;
  370. //ALGORITMO
  371. //Buscar el siguiente en INORDEN
  372. while(SIG->izq !=NULL)
  373. {
  374. PADSIG=SIG;
  375. SIG=SIG->izq;
  376. }
  377. //Desconectarlo
  378. Desconectar12(&(*nodo),SIG,&PADSIG);
  379. //Borrarlo
  380. if(PAD==NULL)
  381. (*nodo)=SIG;
  382. else
  383. {
  384. if(POS==(*PAD)->izq)
  385. (*PAD)->izq=SIG;
  386. else
  387. (*PAD)->der=SIG;
  388. }
  389. SIG->izq=POS->izq;
  390. SIG->der=POS->der;
  391.  
  392. return;
  393. }
  394.  
  395.  
  396. void Limpiar_cadena(char *cadena, int n)
  397. {
  398.    // Variable local.
  399.    int i;
  400.  
  401.    // Sustituimos el \n por un \0.
  402.    i=0;
  403.    while(cadena[i]!='\n' && i<n-1)
  404.    {
  405.        i++;
  406.    }
  407.    cadena[i]='\0';
  408.  
  409.  
  410.    return;
  411. }
  412.  
  413.  
  414.  


« Última modificación: 17 Agosto 2010, 03:05 am por Littlehorse » En línea

Lain SEL

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: eliminar ancestros de hojas arbol binario c++
« Respuesta #2 en: 18 Agosto 2010, 04:05 am »

sip, eres pesado.. pero gracias  ;D cierto me faltaron más comentarios pero si puse y conozco el uso de //
/**/  :silbar:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Creacion de hojas css
Diseño Gráfico
pARANOID 2 2,254 Último mensaje 4 Junio 2004, 03:07 am
por Azielito
Eliminar nodo en un arbol binario
.NET (C#, VB.NET, ASP)
DaNuK 4 29,005 Último mensaje 6 Diciembre 2010, 20:19 pm
por DaNuK
[Ayuda] Eliminar entradas en un binario
Programación C/C++
nolosabe 4 2,540 Último mensaje 31 Octubre 2011, 16:25 pm
por nolosabe
Eliminar duplicados fichero binario
Programación C/C++
andrewmetal93 1 2,036 Último mensaje 9 Mayo 2012, 19:23 pm
por andrewmetal93
eliminar un dato de arbol
Programación C/C++
Anduresu 0 1,849 Último mensaje 30 Julio 2020, 00:36 am
por Anduresu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines