Advertisement
Guest User

Untitled

a guest
Feb 19th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. /*
  2. Name: Arboles Binarios
  3. Copyright:
  4. Author:
  5. Date: 15/08/16 22:25
  6. Description: Programa para arboles binarios de busques
  7. */
  8.  
  9. #include <iostream>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. class nodo{
  15.  
  16. private:
  17.  
  18. int clave;
  19. int contador;
  20. nodo *izdo;
  21. nodo *dcho;
  22.  
  23. //Contrsuctor
  24. nodo(int cl = 0, int con = 1, nodo *iz = NULL, nodo *de = NULL){
  25.  
  26. clave = cl;
  27. contador = con;
  28. izdo = iz;
  29. dcho = de;
  30. }
  31.  
  32. friend class ArbolBus;
  33.  
  34. };
  35.  
  36.  
  37. typedef nodo *pnodo;
  38. pnodo q;
  39.  
  40.  
  41. class ArbolBus{
  42.  
  43. private:
  44.  
  45. nodo *raiz;
  46. void LiberarMem(pnodo);
  47.  
  48.  
  49. public:
  50.  
  51. //Constructor y detructor
  52. ArbolBus(pnodo r = NULL){
  53.  
  54. raiz = r;
  55. }
  56.  
  57. ~ArbolBus() { LiberarMem(raiz); }
  58.  
  59. //Metodos
  60. int ArbolVacio(pnodo raiz){ return raiz == NULL;}
  61.  
  62. void BuscarClave(int x){buscar(x, raiz);}
  63. void buscar(int, pnodo &);
  64.  
  65. void Visualizar(int n){visualizar_arbol(raiz, n);}
  66. void visualizar_arbol(pnodo, int);
  67.  
  68. void VerPreOrden(){cout << " Recorrido en Pre-Orden: "; PreOrden(raiz); }
  69. void PreOrden(pnodo &b);
  70.  
  71. void VerInOrden(){cout << " Recorrido en In-Orden: "; InOrden(raiz); }
  72. void InOrden(pnodo &b);
  73.  
  74. void VerPostOrden(){cout << " Recorrido en Post-Orden: "; PostOrden(raiz); }
  75. void PostOrden(pnodo &b);
  76.  
  77. void BorrarNodo(int x){borrar(x, raiz);}
  78. void borrar(int x, pnodo &p);
  79. void borrar_nodo(pnodo &d);
  80. };
  81.  
  82.  
  83.  
  84. void ArbolBus::LiberarMem(pnodo a){
  85. if(!ArbolVacio(a)){
  86. LiberarMem(a->izdo);
  87. LiberarMem(a->dcho);
  88. delete a;
  89. }
  90. }
  91.  
  92.  
  93. void ArbolBus::buscar(int x, pnodo &a){
  94.  
  95. if(ArbolVacio(a))
  96. {
  97. a = new nodo(x);
  98. }
  99. else
  100. {
  101. if (x < a->clave)
  102. buscar(x, a->izdo);
  103. else
  104. {
  105. if(x > a->clave)
  106. buscar(x, a->dcho);
  107. else
  108. a->contador++;
  109.  
  110. }
  111. }
  112. };
  113.  
  114.  
  115. void ArbolBus::visualizar_arbol(pnodo a, int n){
  116.  
  117. int i;
  118. if(!ArbolVacio(a))
  119. {
  120. visualizar_arbol(a->izdo, n+1);
  121.  
  122. for (i=1; i <= n; i++)
  123. cout << " ";
  124. printf("%d(%d,%d, %d)\n", a->clave, a->contador, i, n);
  125. visualizar_arbol(a->dcho, n+1);
  126. }
  127. }
  128.  
  129. void ArbolBus::borrar(int x, pnodo &p){
  130.  
  131.  
  132.  
  133. //buscar el nodo que se desea borrar
  134. if(ArbolVacio(p))
  135. cout << "\n Ese nodo no esta en el arbol\n\n";
  136. else if(x < p->clave)
  137. borrar(x, p->izdo);
  138. else if (x > p->clave)
  139. borrar(x, p->dcho);
  140. else{ // borrar el nodo apuntado por p
  141. q = p;
  142. if(q->dcho == NULL)
  143. p = q->izdo;
  144. else if (q->izdo == NULL)
  145. p = q->dcho;
  146. else
  147. borrar_nodo(q->izdo);
  148. delete q;
  149.  
  150. }
  151. }
  152.  
  153. void ArbolBus::borrar_nodo(pnodo &d){
  154.  
  155.  
  156. //descender al nodo mas a la derecha del subarbol d
  157. if (d->dcho != NULL)
  158. borrar_nodo(d->dcho);
  159. else
  160. {
  161. q->clave = d->clave;
  162. q->contador = d->contador;
  163. q = d;
  164. d = d->izdo;
  165. }
  166. }
  167.  
  168. void ArbolBus::PreOrden(pnodo &b){
  169.  
  170.  
  171. if( b != NULL){
  172.  
  173. cout << b->clave << ", ";
  174. PreOrden(b->izdo);
  175. PreOrden(b->dcho);
  176. }
  177. }
  178.  
  179. void ArbolBus::InOrden(pnodo &b){
  180.  
  181. if( b != NULL){
  182.  
  183. InOrden(b->izdo);
  184. cout << b->clave << ", ";
  185. InOrden(b->dcho);
  186. }
  187.  
  188. }
  189.  
  190. void ArbolBus::PostOrden(pnodo &b){
  191.  
  192. if( b != NULL){
  193.  
  194. PostOrden(b->izdo);
  195. PostOrden(b->dcho);
  196. cout << b->clave << ", ";
  197. }
  198.  
  199. }
  200.  
  201.  
  202.  
  203. int main(){
  204.  
  205. cout << endl << endl;
  206.  
  207. ArbolBus arbol_b;
  208. int k;
  209.  
  210. system("cls");
  211.  
  212. /*
  213. cout << "Introducir claves. Finalizar con ^Z\n\n";
  214. cout << "Clave: ";
  215. while(cin >> k){
  216. arbol_b.BuscarClave(k);
  217. cout << "clave: ";
  218. }
  219. */
  220. cout << endl << endl;
  221.  
  222. arbol_b.BuscarClave(10);
  223. arbol_b.BuscarClave(5);
  224. arbol_b.BuscarClave(15);
  225. arbol_b.BuscarClave(3);
  226. arbol_b.BuscarClave(8);
  227. arbol_b.BuscarClave(1);
  228. arbol_b.BuscarClave(4);
  229. arbol_b.BuscarClave(13);
  230. arbol_b.BuscarClave(18);
  231.  
  232. arbol_b.Visualizar(0);
  233. cout << endl << endl;
  234.  
  235.  
  236. arbol_b.VerPreOrden();
  237. cout << endl << endl;
  238. arbol_b.VerInOrden();
  239. cout << endl << endl;
  240. arbol_b.VerPostOrden();
  241. cout << endl << endl;
  242.  
  243. cout << "Desea borrar un Nodo:" ; cin >> k;
  244. arbol_b.BorrarNodo(k);
  245.  
  246.  
  247. arbol_b.Visualizar(0);
  248.  
  249.  
  250. cout << endl << endl;
  251. system("PAUSE");
  252. return 0;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement