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)