Graphviz渲染通用树异常:仅显示根节点与两个子节点,其余缺失
问题原因
你的代码里每个节点调用show()时都会新建一个graphviz.Digraph实例,根节点的图只包含自身和直接子节点,子节点的show()会生成独立的图形文件,最终你看到的只是根节点生成的那部分,深层节点的内容根本没合并到主图里。
修复代码
保持TreeNode类不变
from typing import Any, List import graphviz class TreeNode: value: Any children: List['TreeNode'] def __init__(self, value: Any) -> None: self.value = value self.children = []
修改show方法,共用同一个图实例
def show(self): dot = graphviz.Digraph("Tree", format="png") self._build_graph(dot) dot.render(directory='doctest-output').replace('\\', '/') def _build_graph(self, dot: graphviz.Digraph): # 用id确保节点标识唯一,避免不同节点的str表示重复 node_id = str(id(self)) dot.node(node_id, str(self.value)) for child in self.children: child._build_graph(dot) dot.edge(node_id, str(id(child)))
关键说明
- 拆分出
_build_graph递归方法,让整个树共用同一个Digraph实例,所有节点和边都添加到这张图里 - 使用
id(self)作为节点ID,避免不同节点因默认对象字符串可能出现的重复问题 - 只在根节点的
show()里执行一次渲染,确保所有节点都被包含在最终的PNG中
内容的提问来源于stack exchange,提问作者mkownak
相关产品推荐
相关产品推荐

