fork(1) download
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4.  
  5. struct Nodo {
  6. int dato;
  7. Nodo *izq;
  8. Nodo *der;
  9.  
  10. // Constructor
  11. Nodo(int valor) : dato(valor), izq(nullptr), der(nullptr) {}
  12. };
  13.  
  14. class ArbolBinarioBusqueda {
  15. private:
  16. Nodo *raiz;
  17.  
  18. void insertarRec(Nodo *&r, int n) {
  19. if (r == nullptr) {
  20. r = new Nodo(n);
  21. } else if (n < r->dato) {
  22. insertarRec(r->izq, n);
  23. } else if (n > r->dato) {
  24. insertarRec(r->der, n);
  25. }
  26. }
  27.  
  28. // Recorrido preorden
  29. void preordenRec(Nodo *r) const {
  30. if (r == nullptr) return;
  31. cout << r->dato << ' ';
  32. preordenRec(r->izq);
  33. preordenRec(r->der);
  34. }
  35.  
  36. // Recorrido inorden
  37. void inordenRec(Nodo *r) const {
  38. if (r == nullptr) return;
  39. inordenRec(r->izq);
  40. cout << r->dato << ' ';
  41. inordenRec(r->der);
  42. }
  43.  
  44. // Recorrido postorden
  45. void postordenRec(Nodo *r) const {
  46. if (r == nullptr) return;
  47. postordenRec(r->izq);
  48. postordenRec(r->der);
  49. cout << r->dato << ' ';
  50. }
  51.  
  52. // Recorrido por nivel
  53. void nivelRec(Nodo *r) const {
  54. if (r == nullptr) return;
  55. queue<Nodo*> cola;
  56. cola.push(r);
  57. while (!cola.empty()) {
  58. Nodo *actual = cola.front();
  59. cola.pop();
  60. cout << actual->dato << ' ';
  61. if (actual->izq != nullptr) cola.push(actual->izq);
  62. if (actual->der != nullptr) cola.push(actual->der);
  63. }
  64. }
  65.  
  66. // Liberar memoria
  67. void liberar(Nodo *r) {
  68. if (r == nullptr) return;
  69. liberar(r->izq);
  70. liberar(r->der);
  71. delete r;
  72. }
  73.  
  74. public:
  75. // Constructor
  76. ArbolBinarioBusqueda() : raiz(nullptr) {}
  77.  
  78. // Destructor
  79. ~ArbolBinarioBusqueda() {
  80. liberar(raiz);
  81. }
  82.  
  83. // Métodos públicos
  84. void insertar(int n) {
  85. insertarRec(raiz, n);
  86. }
  87.  
  88. void mostrarPreorden() const {
  89. cout << "Recorrido Preorden: ";
  90. preordenRec(raiz);
  91. cout << '\n';
  92. }
  93.  
  94. void mostrarInorden() const {
  95. cout << "Recorrido Inorden: ";
  96. inordenRec(raiz);
  97. cout << '\n';
  98. }
  99.  
  100. void mostrarPostorden() const {
  101. cout << "Recorrido Postorden: ";
  102. postordenRec(raiz);
  103. cout << '\n';
  104. }
  105.  
  106. void mostrarPorNivel() const {
  107. cout << "Recorrido por Nivel: ";
  108. nivelRec(raiz);
  109. cout << '\n';
  110. }
  111.  
  112. bool estaVacio() const {
  113. return raiz == nullptr;
  114. }
  115. };
  116.  
  117. int main() {
  118. ArbolBinarioBusqueda arbol;
  119. int n;
  120.  
  121. cin >> n;
  122. while (n > 0) {
  123. arbol.insertar(n);
  124. cin >> n;
  125. }
  126.  
  127. if (!arbol.estaVacio()) {
  128. arbol.mostrarPreorden();
  129. arbol.mostrarInorden();
  130. arbol.mostrarPostorden();
  131. arbol.mostrarPorNivel();
  132. } else {
  133. cout << "El árbol está vacío.\n";
  134. }
  135.  
  136. return 0;
  137. }
Success #stdin #stdout 0s 5320KB
stdin
20 30 15 25 18 0
stdout
Recorrido Preorden: 20 15 18 30 25 
Recorrido Inorden: 15 18 20 25 30 
Recorrido Postorden: 18 15 25 30 20 
Recorrido por Nivel: 20 15 30 18 25