251 lines
6.3 KiB
Python
Executable File
251 lines
6.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Clase Arbol Binario
|
|
"""
|
|
from collections import deque
|
|
from math import inf
|
|
import subprocess
|
|
|
|
|
|
class Nodo:
|
|
def __init__(self, val):
|
|
self.val = val
|
|
self.left = None
|
|
self.right = None
|
|
|
|
|
|
|
|
# ./01_valores_lejanos_primero.py
|
|
def ValoresLejanosPrioridad(self):
|
|
"""
|
|
retorna valor de nodos priorizando profundidad a nivel (de izquierda a derecha)
|
|
usando recursividad y desempaquetado de lista (operador '*')
|
|
"""
|
|
if self is None:
|
|
return []
|
|
val_izq = ValoresLejanosPrioridad(self.left)
|
|
val_der = ValoresLejanosPrioridad(self.right)
|
|
return [self.val, *val_izq, *val_der]
|
|
|
|
|
|
def ValoresLejanosPrioridad2(self):
|
|
"""
|
|
retorna valor de nodos priorizando profundidad a nivel (de izquierda a derecha)
|
|
usando recursividad, sumando las listas retornadas en cada recursión
|
|
"""
|
|
if self is None:
|
|
return []
|
|
val_izq = ValoresLejanosPrioridad2(self.left)
|
|
val_der = ValoresLejanosPrioridad2(self.right)
|
|
return [self.val] + val_izq + val_der
|
|
|
|
|
|
def ValoresLejanosPrioridad3(self):
|
|
"""
|
|
retorna valor de nodos priorizando profundidad a nivel (de izquierda a derecha)
|
|
usando una lista como pila (lifo)
|
|
"""
|
|
pila = [self]
|
|
valores = []
|
|
if self == None:
|
|
return []
|
|
while pila:
|
|
actual = pila.pop()
|
|
valores.append(actual.val)
|
|
if actual.right:
|
|
pila.append(actual.right)
|
|
if actual.left:
|
|
pila.append(actual.left)
|
|
return valores
|
|
|
|
|
|
# ./02_valores_nivel_primero.py
|
|
def ValoresPrioridadNivel(self):
|
|
"""
|
|
retorna valor de nodos de un arbol binario
|
|
priorizando nivel (de izquierda a derecha)
|
|
usando una lista como cola/fila* (fifo)
|
|
*cola (from collections import deque)
|
|
"""
|
|
cola = deque([self])
|
|
valores = []
|
|
if self == None:
|
|
return []
|
|
while cola:
|
|
actual = cola.popleft()
|
|
valores.append(actual.val)
|
|
if actual.left:
|
|
cola.append(actual.left)
|
|
if actual.right:
|
|
cola.append(actual.right)
|
|
return valores
|
|
|
|
|
|
def ValoresPrioridadNivel2(self):
|
|
"""
|
|
retorna valor de nodos de un arbol binario
|
|
priorizando nivel (de izquierda a derecha)
|
|
usando una lista y pop(0)* (fifo)
|
|
*adelanta los indices un valor
|
|
"""
|
|
cola = [self]
|
|
valores = []
|
|
if self == None:
|
|
return []
|
|
while cola:
|
|
actual = cola.pop(0)
|
|
valores.append(actual.val)
|
|
if actual.left:
|
|
cola.append(actual.left)
|
|
if actual.right:
|
|
cola.append(actual.right)
|
|
return valores
|
|
|
|
|
|
# ./03_arbol_incluye.py
|
|
def ArbolIncluye(self, valor):
|
|
"""
|
|
retorna booleano según existencia en árbol binario
|
|
del valor consultado, utilizando recursión
|
|
"""
|
|
if self is None:
|
|
return False
|
|
if self.val == valor:
|
|
return True
|
|
return ArbolIncluye(self.left, valor) or ArbolIncluye(self.right, valor)
|
|
|
|
|
|
def ArbolIncluye2(self, valor):
|
|
"""
|
|
retorna booleano según existencia en árbol binario
|
|
del valor consultado utilizando una cola o fila(fifo)
|
|
"""
|
|
if self is None:
|
|
return False
|
|
cola = deque([self])
|
|
while cola:
|
|
actual = cola.popleft()
|
|
if actual.val == valor:
|
|
return True
|
|
if actual.left:
|
|
cola.append(actual.left)
|
|
if actual.right:
|
|
cola.append(actual.right)
|
|
return False
|
|
|
|
|
|
# ./04_suma_valores.py
|
|
def SumaValores(self):
|
|
"""
|
|
retorna la suma de todos los valores del árbol binario
|
|
recursivamente.
|
|
"""
|
|
if self is None:
|
|
return 0
|
|
return self.val + SumaValores(self.left) + SumaValores(self.right)
|
|
|
|
|
|
def SumaValores2(self):
|
|
"""
|
|
retorna la suma de todos los valores del árbol binario
|
|
"""
|
|
if self is None:
|
|
return 0
|
|
cola = deque([self])
|
|
suma = 0
|
|
while cola:
|
|
actual = cola.popleft()
|
|
suma += actual.val
|
|
if actual.left:
|
|
cola.append(actual.left)
|
|
if actual.right:
|
|
cola.append(actual.right)
|
|
return suma
|
|
|
|
|
|
def SumaValores3(self):
|
|
"""
|
|
retorna la suma de todos los valores del árbol binario
|
|
reutiliza la función ValoresNivelPrioridad()
|
|
"""
|
|
valores = ValoresPrioridadNivel(self)
|
|
suma_valores = sum(valores)
|
|
return suma_valores
|
|
|
|
|
|
|
|
# ./05_valor_minimo.py
|
|
def ValorMinimo(self):
|
|
"""
|
|
retorna el valor mínimo en árbol binario usando recursividad
|
|
"""
|
|
if self is None:
|
|
return inf
|
|
min_izq = ValorMinimo(self.left)
|
|
min_der = ValorMinimo(self.right)
|
|
return min(self.val, min_izq, min_der)
|
|
|
|
|
|
def ValorMinimo2(self):
|
|
"""
|
|
retorna el valor mínimo en árbol binario usando una cola/fila(fifo)
|
|
"""
|
|
minimo = inf
|
|
cola = deque([self])
|
|
while cola:
|
|
actual = cola.popleft()
|
|
if actual.val < minimo:
|
|
minimo = actual.val
|
|
if actual.left:
|
|
cola.append(actual.left)
|
|
if actual.right:
|
|
cola.append(actual.right)
|
|
return minimo
|
|
|
|
|
|
def ValorMinimo3(self):
|
|
"""
|
|
retorna el valor mínimo en árbol binario, reutiliza
|
|
funcion ValoresPrioridadNivel
|
|
"""
|
|
valores = ValoresPrioridadNivel(self)
|
|
minimo = min(valores)
|
|
return minimo
|
|
|
|
|
|
|
|
# 06_suma_mayor_rutas.py
|
|
def SumaMayorDeRutas(self):
|
|
"""
|
|
retorna la mayor suma de los valores de las rutas(root-leaf)
|
|
del árbol binario, usando recursividad
|
|
"""
|
|
if self is None:
|
|
return -inf
|
|
if self.left is None and self.right is None:
|
|
return self.val
|
|
mayor = max(SumaMayorDeRutas(self.left), SumaMayorDeRutas(self.right))
|
|
return self.val + mayor
|
|
|
|
|
|
def SumaMayorDeRutas2(self):
|
|
"""
|
|
retorna la mayor suma de los valores de las rutas(root-leaf)
|
|
del árbol binario, usando recursividad
|
|
"""
|
|
if self is None:
|
|
return float('-inf')
|
|
if self.left is None and self.right is None:
|
|
return self.val
|
|
mayor = max(SumaMayorDeRutas2(self.left), SumaMayorDeRutas2(self.right))
|
|
return self.val + mayor
|
|
|
|
if __name__ == '__main__':
|
|
subprocess.call(["python", "./01_valores_lejanos_primero.py"])
|
|
subprocess.call(["python", "./02_valores_nivel_primero.py"])
|
|
subprocess.call(["python", "./03_arbol_incluye.py"])
|
|
subprocess.call(["python", "./04_suma_valores.py"])
|
|
subprocess.call(["python", "./05_valor_minimo.py"])
|
|
subprocess.call(["python", "./06_suma_mayor_rutas.py"])
|
|
|