Beim Programmieren kommt es auf Lesbarkeit an, einbuchstabige Variablennamen sind nur schlecht lesbar. Magische Indexwerte genausowenig. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.
`empty_to_node` tut einfach nichts, wenn die Node nicht leer ist, das kann zu schwer zu findende Fehler führen. Im Fehlerfall sollte nicht einfach "nichts" passieren, sondern eine Fehlermeldung ausgegeben werden.
Warum gibt es `empty_st`?
`elem` sollte `is_value_in_tree` heißen, wie ich schon im anderen Thread von Deinem Kollegen geschrieben hatte.
`empty_search_tree` ist die dritte Variante von `empty`. Warum nur?
Hier das ganze mal in einigermaßen lesbar:
Code: Alles auswählen
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __str__(self):
return f"<{self.left}, {self.value}, {self.right}>"
def is_value_in_tree(value, tree):
if tree is None:
return False
elif value < tree.value:
return is_value_in_tree(value, tree.left)
elif value > tree.value:
return is_value_in_tree(value, tree.right)
else:
return True
def add(value, tree):
if value < tree.value:
if tree.left is None:
tree.left = Node(value)
return True
return add(value, tree.left)
elif value > tree.value:
if tree.right is None:
tree.right = Node(value)
return True
return add(value, tree.right)
else:
return False
test_tree = Node(left=Node(2), value=5, right=Node(7, right=Node(10)))
print(is_value_in_tree(3, test_tree))
print(add(8, test_tree))
print(test_tree)
for i in range(12):
print((i, is_value_in_tree(i, test_tree)))
oder gleich mit einer `Tree`-Klasse:
Code: Alles auswählen
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __str__(self):
return f"<{self.left}, {self.value}, {self.right}>"
class Tree:
def __init__(self, values):
self.node = None
for value in values:
self.add(value)
def __contains__(self, value, node=None):
def contains(node):
if node is None:
return False
elif value < node.value:
return contains(node.left)
elif value > node.value:
return contains(node.right)
else:
return True
if self.node is None:
return False
else:
return contains(self.node)
def add(self, value, node=None):
if node is None:
if self.node is None:
self.node = Node(value)
else:
self.add(value, self.node)
elif value < node.value:
if node.left is None:
node.left = Node(value)
return True
return self.add(value, node.left)
elif value > node.value:
if node.right is None:
node.right = Node(value)
return True
return self.add(value, node.right)
else:
return False
def __str__(self):
return '<>' if self.node is None else str(self.node)
test_tree = Tree([5,2,7,10])
print(3 in test_tree)
print(test_tree.add(8))
print(test_tree)
for i in range(12):
print((i, i in test_tree))
Der Ansatz mit einer while-Schleife ist mal gar nicht so schlecht.