51 lines
1.1 KiB
Python
51 lines
1.1 KiB
Python
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)
|