switched to Graphviz module

Better filename
This commit is contained in:
Oliver Hofmann 2025-05-03 11:26:40 +02:00
parent 1c37ed46bf
commit 63a3460c21
4 changed files with 27 additions and 27 deletions

View File

@ -1,3 +1,4 @@
from utils.memory_array import MemoryArray
from vorlesung.L05_binaere_baeume.avl_tree_node import AVLTreeNode from vorlesung.L05_binaere_baeume.avl_tree_node import AVLTreeNode
from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree
import logging import logging
@ -54,6 +55,8 @@ class AVLTree(BinaryTree):
if parent: if parent:
self.balance(parent) self.balance(parent)
def graph_filename(self):
return "AVLTree"
if __name__ == "__main__": if __name__ == "__main__":
@ -61,7 +64,8 @@ if __name__ == "__main__":
print((indent * 3) * " ", node.value) print((indent * 3) * " ", node.value)
tree = AVLTree() tree = AVLTree()
values = [5, 3, 7, 2, 4, 6, 5, 8] #values = [5, 3, 7, 2, 4, 6, 5, 8]
values = MemoryArray.create_array_from_file("data/seq2.txt")
for value in values: for value in values:
tree.insert(value) tree.insert(value)

View File

@ -9,9 +9,8 @@ class AVLTreeNode(BinaryTreeNode):
def __repr__(self): def __repr__(self):
return f"TreeNode(id={id(self)} value={self.value}, left={self.left}, right={self.right})" return f"TreeNode(id={id(self)} value={self.value}, left={self.left}, right={self.right})"
def gv_rep(self, row, col): def graphviz_rep(self, row, col, dot):
"""Returns the graphviz representation of the node.""" dot.node(str(id(self)), label=str(self.value), pos=f"{col},{-row}!", xlabel=str(self.balance))
return f"{id(self)} [label=\"{self.value}\", pos=\"{col},{-row}!\", xlabel=\"{self.balance}\"];\n"
def update_balance(self): def update_balance(self):
left_height = self.left.height() if self.left else 0 left_height = self.left.height() if self.left else 0

View File

@ -3,6 +3,7 @@ from utils.memory_manager import MemoryManager
from utils.memory_array import MemoryArray from utils.memory_array import MemoryArray
from utils.project_dir import get_path from utils.project_dir import get_path
from datetime import datetime from datetime import datetime
import graphviz
class BinaryTree: class BinaryTree:
@ -69,7 +70,7 @@ class BinaryTree:
break break
else: else:
# Wert nicht gefunden # Wert nicht gefunden
return return None, None
return self.delete_node(current, parent) return self.delete_node(current, parent)
def delete_node(self, current, parent): def delete_node(self, current, parent):
@ -144,37 +145,35 @@ class BinaryTree:
line = 0 line = 0
tree_structure_traversal_recursive(callback, self.root, 0) tree_structure_traversal_recursive(callback, self.root, 0)
def graph_filename(self):
return "BinaryTree"
def graph_traversal(self): def graph_traversal(self):
def define_node(node, level, line): def define_node(node, level, line):
nonlocal file nonlocal dot
if node is not None: if node is not None:
file.write(node.gv_rep(level, line)) node.graphviz_rep(level, line, dot)
def graph_traversal_recursive(current): def graph_traversal_recursive(current):
nonlocal file nonlocal dot
if current is not None: if current is not None:
if current.left: if current.left:
file.write(f"{id(current)} -> {id(current.left)}; \n") dot.edge(str(id(current)), str(id(current.left)))
graph_traversal_recursive(current.left) graph_traversal_recursive(current.left)
if current.right: if current.right:
file.write(f"{id(current)} -> {id(current.right)}; \n") dot.edge(str(id(current)), str(id(current.right)))
graph_traversal_recursive(current.right) graph_traversal_recursive(current.right)
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S") dot = graphviz.Digraph( name="BinaryTree",
filename = f"graph_{timestamp}.gv" engine="neato",
node_attr={"shape": "circle", "fontname": "Arial"},
format="pdf" )
self.tree_structure_traversal(define_node)
graph_traversal_recursive(self.root)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"{self.graph_filename()}_{timestamp}.gv"
filename = get_path(filename) filename = get_path(filename)
with open(filename, "w") as file: dot.render(filename)
file.write("digraph BST {\n")
file.write("layout=neato;\n")
file.write("node [shape=circle, fontname=\"Arial\"];\n")
self.tree_structure_traversal(define_node)
graph_traversal_recursive(self.root)
file.write("}")
if __name__ == "__main__": if __name__ == "__main__":
tree = BinaryTree() tree = BinaryTree()

View File

@ -18,7 +18,5 @@ class BinaryTreeNode(MemoryCell):
def __str__(self): def __str__(self):
return str(self.value) return str(self.value)
def gv_rep(self, row, col): def graphviz_rep(self, row, col, dot):
"""Returns the graphviz representation of the node.""" dot.node(str(id(self)), label=str(self.value), pos=f"{col},{-row}!")
return f"{id(self)} [label=\"{self.value}\", pos=\"{col},{-row}!\"];\n"