Приведенные методы поиска вполне рабочие, ничего не зацикливается. Проблема у вас где-то в другом месте.
Я дополнил код до минимального рабочего, в самих методах только минимальные изменения (возвращаю значение, а не узел со значением, и убрал print-ы):
import random
class Node:
def __init__(self, value, child_l=None, child_r=None):
self.value = value
self.child_l = child_l
self.child_r = child_r
def __repr__(self):
return f"{type(self).__name__}({self.value!r}, {self.child_l!r}, {self.child_r!r})"
class BinaryTree:
def __init__(self, root=None):
assert root is None or isinstance(root, Node)
self.root = root
def _insert(self, node, value):
if node is None:
node = Node(value)
elif value < node.value:
node.child_l = self._insert(node.child_l, value)
else:
node.child_r = self._insert(node.child_r, value)
return node
def insert(self, value):
self.root = self._insert(self.root, value)
def _get_min(self, node):
if node.child_l:
return self._get_min(node.child_l)
else:
return node.value
def get_min(self):
return self._get_min(self.root)
def __repr__(self):
return f"{type(self).__name__}(root={self.root})"
tree = BinaryTree()
values = [random.randint(1, 1000) for _ in range(5)]
for value in values:
tree.insert(value)
print("Values:", values)
print("Tree:", tree)
print("Min from tree:", tree.get_min())
print("Min from list:", min(values))
Пример вывода:
Values: [335, 246, 238, 59, 379]
Tree: BinaryTree(root=Node(335, Node(246, Node(238, Node(59, None, None), None), None), Node(379, None, None)))
Min from tree: 59
Min from list: 59