nach langer Zeit habe ich mich mal wieder Python (3) zugewendet und ein kleines Beispiel-Programm geschrieben, zum traversieren von Bäumen. Allerdings ist es mehr oder weniger nur eine Übersetzung, wie ich es auch in anderen Sprachen realisieren würde. Ich weiß also nicht ob es guter oder schlechter Python-Stil ist und suche Anregungen zur Verbesserung:
Code: Alles auswählen
#!/usr/bin/env python
class Node:
def __init__(self, v, l, r):
self.value = v
self.left = l
self.right = r
def traverse_prefix(self):
out = '( '
out += self.value + ' '
if isinstance(self.left, Node):
out += self.left.traverse_prefix() + ' '
else:
out += str(self.left) + ' '
if isinstance(self.right, Node):
out += self.right.traverse_prefix() + ' '
else:
out += str(self.right) + ' '
out += ')'
return out
def traverse_postfix(self):
out = ''
if isinstance(self.left, Node):
out += self.left.traverse_postfix() + ' '
else:
out += str(self.left) + ' '
if isinstance(self.right, Node):
out += self.right.traverse_postfix() + ' '
else:
out += str(self.right) + ' '
out += self.value + ' '
return out
def traverse_infix(self):
out = '( '
if isinstance(self.left, Node):
out += self.left.traverse_infix() + ' '
else:
out += str(self.left) + ' '
out += self.value + ' '
if isinstance(self.right, Node):
out += self.right.traverse_infix() + ' '
else:
out += str(self.right) + ' '
out += ')'
return out
def to_list(self, list = []):
if isinstance(self.left, Node):
list.append(self.left.to_list(list))
else:
list.append(self.left)
if isinstance(self.right, Node):
list.append(self.right.to_list(list))
else:
list.append(self.right)
list.append(self.value)
class Stack:
def __init__(self):
self.items = []
self.operator = {
"*": lambda x, y: self.items.append(x * y),
"+": lambda x, y: self.items.append(x + y),
"/": lambda x, y: self.items.append(x / y),
"-": lambda x, y: self.items.append(x - y),
}
def push(self, value):
if isinstance(value, int) or isinstance(value, float):
self.items.append(value)
elif value in self.operator:
y, x = self.items.pop(), self.items.pop()
self.operator[value](x , y)
else:
pass
if __name__ == '__main__':
tree = Node('/', Node('*', 2, Node('+', 4, 5)), 8)
print(tree.traverse_prefix())
print(tree.traverse_postfix())
print(tree.traverse_infix())
stack = Stack()
items = []
tree.to_list(items)
for item in items:
print("pushing " + str(item) + " on evaluating stack ...")
stack.push(item)
print("stack now looks like " + str(stack.items))
print(str(stack.items))