From 1c495b8b0c9da61ba1b7319ad7aba937be3a1d22 Mon Sep 17 00:00:00 2001 From: DeathSpain7 <2209086@upy.edu.mx> Date: Tue, 9 Apr 2024 23:49:23 -0600 Subject: [PATCH] Binary Tree --- Binary_Tree.py | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 Binary_Tree.py diff --git a/Binary_Tree.py b/Binary_Tree.py new file mode 100644 index 0000000..1125303 --- /dev/null +++ b/Binary_Tree.py @@ -0,0 +1,115 @@ +class Node: + def __init__(self, key): + self.left = None + self.right = None + self.val = key + +def insert(root, key): + # Si el árbol está vacío, crea un nuevo nodo con el valor dado + if root is None: + return Node(key) + else: + # Si el valor es mayor que el valor actual del nodo, inserta en el sub árbol derecho + if root.val < key: + root.right = insert(root.right, key) + # Si el valor es menor o igual, inserta en el sub árbol izquierdo + else: + root.left = insert(root.left, key) + return root + +def inorder(root): + if root: + # Recorre primero el sub árbol izquierdo + inorder(root.left) + # Imprime el valor del nodo actual + print(root.val) + # Finalmente recorre el sub árbol derecho + inorder(root.right) + +def preorder(root): + if root: + # Imprime el valor del nodo actual primero + print(root.val) + # Recorre el sub árbol izquierdo + preorder(root.left) + # Finalmente recorre el sub árbol derecho + preorder(root.right) + +def postorder(root): + if root: + # Recorre primero el sub árbol izquierdo + postorder(root.left) + # Luego recorre el sub árbol derecho + postorder(root.right) + # Imprime el valor del nodo actual + print(root.val) + +def find_min_node(node): + # Encuentra el nodo con el valor mínimo en un árbol dado + current = node + while current.left is not None: + current = current.left + return current + +def delete_node(root, key): + if root is None: + return root + + if key < root.val: + # Si el valor a eliminar es menor que el valor actual, buscar en el sub árbol izquierdo + root.left = delete_node(root.left, key) + elif key > root.val: + # Si el valor a eliminar es mayor que el valor actual, buscar en el sub árbol derecho + root.right = delete_node(root.right, key) + else: + # Si el nodo a eliminar tiene un solo hijo o ninguno + if root.left is None: + temp = root.right + root = None + return temp + elif root.right is None: + temp = root.left + root = None + return temp + + # Si el nodo a eliminar tiene dos hijos, encontrar el sucesor inorden (nodo con el valor mínimo en el subárbol derecho) + temp = find_min_node(root.right) + # Copiar el valor del sucesor inorden al nodo actual + root.val = temp.val + # Eliminar el sucesor inorden + root.right = delete_node(root.right, temp.val) + + return root + +def display_menu(): + print("1. Insertar nodo") + print("2. Eliminar nodo") + print("3. Recorrer en orden") + print("4. Recorrer en preorden") + print("5. Recorrer en postorden") + print("6. Salir") + return int(input("Seleccione una opción: ")) + +root = None + +while True: + choice = display_menu() + if choice == 1: + key = int(input("Ingrese el valor del nodo a insertar: ")) + root = insert(root, key) + elif choice == 2: + key = int(input("Ingrese el valor del nodo a eliminar: ")) + root = delete_node(root, key) + elif choice == 3: + print("Recorrido en orden:") + inorder(root) + elif choice == 4: + print("Recorrido en preorden:") + preorder(root) + elif choice == 5: + print("Recorrido en postorden:") + postorder(root) + elif choice == 6: + break + else: + print("Opción inválida. Por favor, seleccione una opción válida entre 1 y 6.")