CCCPaste

arbol_aleatorio_orden.py

import random


class ArbolNumerico:

    def __init__(self, cantidad=10, minimo=1, maximo=100):
        self.valores_originales = [random.randint(minimo, maximo) for _ in range(cantidad)]
        self.raiz = None

    # ==============================
    # MÉTODO PRINCIPAL DE ORDENAMIENTO
    # ==============================
    def ordenar_como_bst(self):
        """
        Construye el árbol binario de búsqueda
        insertando los valores uno por uno.
        """
        self.raiz = None
        for valor in self.valores_originales:
            self.raiz = self._insertar(self.raiz, valor)

    # ==============================
    # MÉTODOS AUXILIARES
    # ==============================
    def _insertar(self, nodo, valor):
        """
        Inserta un valor respetando la propiedad BST:
        menores a la izquierda, mayores a la derecha.
        """
        if nodo is None:
            return {"valor": valor, "izq": None, "der": None}

        if valor < nodo["valor"]:
            nodo["izq"] = self._insertar(nodo["izq"], valor)
        else:
            nodo["der"] = self._insertar(nodo["der"], valor)

        return nodo

    def recorrido_inorden(self, nodo=None, resultado=None):
        """
        Devuelve los valores ordenados (in-order traversal).
        """
        if resultado is None:
            resultado = []

        if nodo is None:
            nodo = self.raiz

        if nodo:
            self.recorrido_inorden(nodo["izq"], resultado)
            resultado.append(nodo["valor"])
            self.recorrido_inorden(nodo["der"], resultado)

        return resultado

    def mostrar_estructura(self, nodo=None, nivel=0):
        """
        Muestra el árbol de forma jerárquica.
        """
        if nodo is None:
            nodo = self.raiz

        if nodo:
            self.mostrar_estructura(nodo["der"], nivel + 1)
            print("   " * nivel + str(nodo["valor"]))
            self.mostrar_estructura(nodo["izq"], nivel + 1)

    # ==============================
    # FUNCIÓN AUXILIAR DE ENTRADA
    # ==============================
    @staticmethod
    def main():
        print("=== CREACIÓN DEL ÁRBOL CON VALORES ALEATORIOS ===")
        arbol = ArbolNumerico(cantidad=10)

        print("Valores originales:")
        print(arbol.valores_originales)

        print("\n=== ORDENANDO COMO ÁRBOL BINARIO DE BÚSQUEDA ===")
        arbol.ordenar_como_bst()

        print("\nEstructura del árbol:")
        arbol.mostrar_estructura()

        print("\nRecorrido inorden (resultado ordenado):")
        print(arbol.recorrido_inorden())


# Ejecutar
if __name__ == "__main__":
    ArbolNumerico.main()