рисование дерева
This commit is contained in:
50
lab4/draw_tree.py
Normal file
50
lab4/draw_tree.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from graphviz import Digraph
|
||||
|
||||
|
||||
def make_pow2_sum_tree(n=8):
|
||||
dot = Digraph("FullTree")
|
||||
dot.attr(rankdir="TB") # направление сверху вниз
|
||||
dot.attr("node", shape="circle", style="filled", fillcolor="lightgray")
|
||||
|
||||
node_count = 0
|
||||
|
||||
def new_node(label):
|
||||
nonlocal node_count
|
||||
node_id = f"n{node_count}"
|
||||
node_count += 1
|
||||
dot.node(node_id, label)
|
||||
return node_id
|
||||
|
||||
def pow2_node(xi):
|
||||
n1 = new_node("pow2")
|
||||
n2 = new_node(xi)
|
||||
dot.edge(n1, n2)
|
||||
return n1
|
||||
|
||||
def plus(a, b):
|
||||
n = new_node("+")
|
||||
dot.edge(n, a)
|
||||
dot.edge(n, b)
|
||||
return n
|
||||
|
||||
all_terms = []
|
||||
for i in range(1, n + 1):
|
||||
terms = [pow2_node(f"x{j}") for j in range(1, i + 1)]
|
||||
s = terms[0]
|
||||
for t in terms[1:]:
|
||||
s = plus(s, t)
|
||||
all_terms.append(s)
|
||||
|
||||
root = all_terms[0]
|
||||
for t in all_terms[1:]:
|
||||
root = plus(root, t)
|
||||
|
||||
dot.node("root", "f(x)")
|
||||
dot.edge("root", root)
|
||||
|
||||
return dot
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
g = make_pow2_sum_tree(8)
|
||||
g.render("original_tree", format="png", cleanup=True)
|
||||
Reference in New Issue
Block a user