Advertisement
ambigus9

Arbol.Binario.Seleccion.Repetido.Recorrido.3

Oct 9th, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. // Arboles_Binarios.cpp : main project file.
  2.  
  3. //1. Que no permita agregar nodos repetidos. Si existe, desplegar "Nodo a insertar ya existe".
  4. //2. Para eliminar un nodo con dos hijos preguntar si se sustituye por el predecesor o por el sucesor, y luego hacer la respectiva eliminación.
  5. //3. Al momento de desplegar el arbol debe preguntar que forma lo recorre:
  6. // preorden, in orden, post orden .... nivel por nivel y desplegarlo según el recorido.
  7.  
  8. // Investigar sobre Árboles Balanceados ( AVL )
  9. // 1. ¿Qué es un árbol balanceado
  10. // 2. ¿Qué valores tiene el factor de balance
  11. // 3. ¿Cómo insertar un nodo en un árbol balanceado.
  12. // 3.1 Presentar los casos existentes para balancear un árbol después de la inserción de un nodo.
  13. // 3.2 Presentar ejemplos de cada caso utilizando valores numéricos
  14. // 4. ¿Cómo eliminar un nodo en un árbol balanceado?
  15. // 4.1 Presentar casos existentes para balancear un árbol después de a eliminación de un nodo
  16. // 4.2 Presentar ejemplos de cada caso utilizando valores numéricos.
  17. // 5. Hacer programa insertar, eliminar y desplegar por nivel los nodos de un árbol balanceado
  18.  
  19.  
  20.  
  21. #include"stdafx.h"
  22. #include"iostream"
  23. #include"conio.h"
  24. using namespace System;
  25. using namespace std;
  26.  
  27. class nodoarbol
  28. {
  29. public:
  30. int info;
  31. nodoarbol *der, *izq;
  32. nodoarbol()
  33. {
  34. izq=NULL;
  35. der=NULL;
  36. }
  37. nodoarbol(int dato)
  38. {
  39. info=dato;
  40. izq=NULL;
  41. der=NULL;
  42. }
  43. };
  44. class ABB
  45. {
  46. private:
  47. nodoarbol *raiz;
  48. public:
  49. ABB()
  50. {
  51. raiz=NULL;
  52. }
  53. ~ABB()
  54. {
  55. cout<<"Entro al destructor "<<endl;
  56. borrar_nodos(raiz);
  57. cout<<"Salgo del destructor"<<endl;
  58. }
  59. void borrar_nodos(nodoarbol *raiz)
  60. {
  61. if(raiz != NULL)
  62. {
  63. borrar_nodos(raiz->izq);
  64. borrar_nodos(raiz->der);
  65. cout<<"Destructor de "<<raiz->info<<endl;
  66. delete raiz;
  67. }
  68. }
  69.  
  70.  
  71. void insertar ()
  72. {
  73. nodoarbol *auxl, *aux2, *aux3;
  74. auxl=new nodoarbol;
  75. aux2=raiz;
  76. aux3=NULL;
  77. int buscador=0;
  78. cout<<"Entre el valor del nodo a insertar:";
  79. cin>>auxl->info;
  80. while(aux2!=NULL) // Este ciclo recorre el arbol.
  81. {
  82. aux3=aux2; // El aux3 siempre señalará al nodo PADRE al nodo que señala aux2
  83. if( auxl->info==aux2->info )
  84. {
  85. buscador=buscador+1;
  86. cout<<"El nodo a insertar ya existe"<<endl;
  87. break;
  88. }
  89. if(auxl->info>aux2->info) aux2=aux2->der;
  90. else aux2=aux2->izq;
  91. }
  92. if( buscador==0 )
  93. {
  94. if(aux3==NULL) raiz=auxl; // Primera inserción
  95. else
  96. if(auxl->info<aux3->info) aux3->izq=auxl;
  97. else aux3->der=auxl;
  98. }
  99.  
  100. }
  101. nodoarbol *devolver_raiz ()
  102. {
  103. return raiz;
  104. }
  105.  
  106.  
  107. void despliega(nodoarbol *raiz)// InOrden
  108. {
  109. if(raiz!=NULL)
  110. {
  111. despliega(raiz->izq);
  112. cout<<raiz->info<<endl;
  113. despliega(raiz->der);
  114. }
  115. }
  116.  
  117. void preOrden(nodoarbol *raiz)
  118. {
  119. if(raiz!=NULL)
  120. {
  121. cout<<raiz->info<<endl;
  122. preOrden(raiz->izq);
  123. preOrden(raiz->der);
  124. }
  125. }
  126.  
  127. void postOrden(nodoarbol *raiz)
  128. {
  129. if(raiz!=NULL)
  130. {
  131. postOrden(raiz->izq);
  132. postOrden(raiz->der);
  133. cout<<raiz->info<<endl;
  134. }
  135. }
  136.  
  137.  
  138. void eliminar_nodo(int valor)
  139. {
  140. nodoarbol *auxl, *aux2, *temp;
  141. int numero;
  142. bool b;
  143. // Inicio de la busqueda del nodo a eliminar
  144. if(raiz!=NULL)
  145. {
  146. auxl=raiz;
  147. aux2=NULL; // Siempre señala al nodo PADRE del que señala el apuntador AUX1
  148.  
  149. while(auxl->info!=valor)
  150. {
  151. aux2=auxl;
  152. if(valor<auxl->info) auxl=auxl->izq;
  153. else auxl=auxl->der;
  154. if(auxl==NULL)
  155. {
  156. cout<<"EL NODO A ELIMINAR NO EXISTE"<<endl;
  157. break;
  158. }
  159. }
  160. }
  161. else
  162. {
  163. cout<<"EL ARBOL NO CONTIENE NODOS"<<endl;
  164. auxl=NULL;
  165. }
  166. // Fin de la busqueda del nodo a eliminar.
  167. // En auxl queda la dirección del nodo a eliminar.
  168. // En aux2 queda la dirección del nodo PADRE del nodo a eliminar
  169. if(auxl!=NULL)
  170. {
  171. //Cuando no tiene hijos
  172. temp=auxl ;
  173. if((auxl->izq==NULL)&&(auxl->der==NULL))
  174. {
  175. if(aux2!=NULL)
  176. {
  177. if(auxl->info>aux2->info) aux2->der=NULL;
  178. else aux2->izq=NULL;
  179. }
  180. else
  181. {
  182. raiz=NULL;
  183. }
  184. }
  185. else
  186. {
  187. if ((auxl->izq!=NULL)&&(auxl->der!=NULL))
  188. { //Cuando tiene dos hijos
  189. aux2=auxl; //con el predecesor ( PADRE )
  190.  
  191. b=true;
  192.  
  193. cout<<" "<<endl;
  194. cout<<"Por cual nodo desea sustituir el nodo a eliminar?"<<endl;
  195. cout<<" "<<endl;
  196. cout<<"1. Predecesor"<<endl;
  197. cout<<"2. Sucesor"<<endl;
  198. cout<<" "<<endl;
  199. cin>>numero;
  200.  
  201. switch( numero )
  202. {
  203. case 1:
  204. temp=auxl->izq;
  205. while (temp->der!=NULL)
  206. {
  207. aux2=temp;
  208. temp=temp->der;
  209. b=false;
  210. };
  211. auxl->info=temp->info; // Cambiar por Predesesor
  212. cout<<"El predecesor es: "<<endl;
  213. cout<<auxl->info<<endl;
  214. break;
  215.  
  216. case 2:
  217. temp=auxl->der;
  218. while (temp->izq!=NULL)
  219. {
  220. aux2=temp;
  221. temp=temp->izq;
  222. b=false;
  223. };
  224. auxl->info=temp->info; // Cambiar por Sucesor
  225. cout<<"El sucesor es: "<<endl;
  226. cout<<auxl->info<<endl;
  227. break;
  228.  
  229. default: cout<<"Error de digitacion"<<endl; /* break; */
  230. };
  231.  
  232.  
  233.  
  234. if (b==true)auxl->izq=temp->izq;
  235. else
  236. {
  237. if(temp->izq!=NULL) aux2->der=temp->izq;
  238. else aux2->der=NULL;
  239. }
  240.  
  241. }
  242. else
  243. { //cuando tiene un solo hijo
  244. if(auxl->izq==NULL)
  245. if (aux2!=NULL)
  246. {
  247. if (auxl->info<aux2->info)
  248. aux2->izq=auxl->der;
  249. else aux2->der=auxl->der;
  250. }
  251. else raiz=auxl->der;
  252. else
  253. if(aux2!=NULL)
  254. {
  255. if (auxl->info<aux2->info)
  256. aux2->izq=auxl->izq;
  257. else aux2->der=auxl->izq;
  258. }
  259. else raiz=auxl->izq;
  260. }
  261. }
  262. delete temp;
  263. }
  264. }
  265. };
  266. void main()
  267. {
  268. nodoarbol *raiz;
  269. char resp;
  270. int valor, numero;
  271. ABB n ;
  272. do
  273. {
  274. n.insertar (); // Agrega un nuevo nodo al arbol
  275. cout<<"Desea crear otro nodo (s/n):";
  276. cin>>resp;
  277. cout<<endl;
  278. resp=tolower(resp);
  279. }while(resp!='n');
  280. cout<<"LOS NODOS DEL ARBOL (inorden) SON"<<endl;
  281. raiz=n.devolver_raiz();
  282. n.despliega(raiz);
  283. do
  284. {
  285. cout<<"Entre el valor del nodo a eliminar"<<endl;
  286. cin>>valor;
  287. n.eliminar_nodo(valor);
  288. cout<<endl;
  289.  
  290. cout<<" "<<endl;
  291. cout<<"Como desea eliminar los nodos?"<<endl;
  292. cout<<" "<<endl;
  293. cout<<"1. InOrden"<<endl;
  294. cout<<"2. PreOrden"<<endl;
  295. cout<<"3. PostOrden"<<endl;
  296. cout<<" "<<endl;
  297. cin>>numero;
  298.  
  299. switch( numero )
  300. {
  301. case 1: raiz=n.devolver_raiz();
  302. n.despliega(raiz);
  303. break;
  304. case 2: raiz=n.devolver_raiz();
  305. n.preOrden(raiz);
  306. break;
  307. case 3: raiz=n.devolver_raiz();
  308. n.postOrden(raiz);
  309. break;
  310. default: cout<<"Error de digitacion"<<endl; /* break; */
  311. };
  312.  
  313. cout<<"Desea eliminar otro nodo (s/n) : "<<endl;
  314. cin>>resp;
  315. cout<<endl;
  316. resp=tolower(resp);
  317. }while(resp!='n');
  318. getch();
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement