#include <iostream>
#include <queue>
using namespace std;
struct Nodo {
int dato;
Nodo *izq;
Nodo *der;
// Constructor
Nodo(int valor) : dato(valor), izq(nullptr), der(nullptr) {}
};
class ArbolBinarioBusqueda {
private:
Nodo *raiz;
void insertarRec(Nodo *&r, int n) {
if (r == nullptr) {
r = new Nodo(n);
} else if (n < r->dato) {
insertarRec(r->izq, n);
} else if (n > r->dato) {
insertarRec(r->der, n);
}
}
// Recorrido preorden
void preordenRec(Nodo *r) const {
if (r == nullptr) return;
cout << r->dato << ' ';
preordenRec(r->izq);
preordenRec(r->der);
}
// Recorrido inorden
void inordenRec(Nodo *r) const {
if (r == nullptr) return;
inordenRec(r->izq);
cout << r->dato << ' ';
inordenRec(r->der);
}
// Recorrido postorden
void postordenRec(Nodo *r) const {
if (r == nullptr) return;
postordenRec(r->izq);
postordenRec(r->der);
cout << r->dato << ' ';
}
// Recorrido por nivel
void nivelRec(Nodo *r) const {
if (r == nullptr) return;
queue<Nodo*> cola;
cola.push(r);
while (!cola.empty()) {
Nodo *actual = cola.front();
cola.pop();
cout << actual->dato << ' ';
if (actual->izq != nullptr) cola.push(actual->izq);
if (actual->der != nullptr) cola.push(actual->der);
}
}
// Liberar memoria
void liberar(Nodo *r) {
if (r == nullptr) return;
liberar(r->izq);
liberar(r->der);
delete r;
}
public:
// Constructor
ArbolBinarioBusqueda() : raiz(nullptr) {}
// Destructor
~ArbolBinarioBusqueda() {
liberar(raiz);
}
// Métodos públicos
void insertar(int n) {
insertarRec(raiz, n);
}
void mostrarPreorden() const {
cout << "Recorrido Preorden: ";
preordenRec(raiz);
cout << '\n';
}
void mostrarInorden() const {
cout << "Recorrido Inorden: ";
inordenRec(raiz);
cout << '\n';
}
void mostrarPostorden() const {
cout << "Recorrido Postorden: ";
postordenRec(raiz);
cout << '\n';
}
void mostrarPorNivel() const {
cout << "Recorrido por Nivel: ";
nivelRec(raiz);
cout << '\n';
}
bool estaVacio() const {
return raiz == nullptr;
}
};
int main() {
ArbolBinarioBusqueda arbol;
int n;
cin >> n;
while (n > 0) {
arbol.insertar(n);
cin >> n;
}
if (!arbol.estaVacio()) {
arbol.mostrarPreorden();
arbol.mostrarInorden();
arbol.mostrarPostorden();
arbol.mostrarPorNivel();
} else {
cout << "El árbol está vacío.\n";
}
return 0;
}