【发布时间】:2012-06-19 07:17:23
【问题描述】:
如何在其一侧打印二叉树,使输出看起来像这样?
__/a
__/ \b
\ _/c
\_/ \d
\e
(欢迎使用更漂亮的 ascii-art)
下面是一些不太有效的代码:
def print_tree(tree):
def emit(node,prefix):
if "sequence" in node:
print "%s%s"%(prefix[:-1],node["name"])
else:
emit(node["left"],"%s_/ "%prefix.replace("/ "," /")[:-1].replace("_"," "))
emit(node["right"],"%s \\ "%prefix.replace("\\ "," \\")[:-1])
emit(tree,"")
哪个输出这个:
_/hg19
_/ \rheMac2
_/ \mm9
/\_/bosTau4
/ \_/canFam2
_/ \pteVam1
\_/loxAfr3
\dasNov2
范围蔓延:如果你可以传入一个函数,该函数将返回字符串以打印任何节点,那就太好了;这样,我有时也可以打印有关非离开节点的信息。所以一个节点是否有要打印的东西是由作为参数传入的函数控制的。
以下是 JSON 格式的一些测试数据:
{
"left": {
"left": {
"left": {
"left": {
"name": "hg19",
"sequence": 0
},
"right": {
"name": "rheMac2",
"sequence": 1
}
},
"right": {
"name": "mm9",
"sequence": 2
}
},
"right": {
"left": {
"name": "bosTau4",
"sequence": 3
},
"right": {
"left": {
"name": "canFam2",
"sequence": 4
},
"right": {
"name": "pteVam1",
"sequence": 5
}
}
}
},
"right": {
"left": {
"name": "loxAfr3",
"sequence": 6
},
"right": {
"name": "dasNov2",
"sequence": 7
}
}
}
【问题讨论】:
-
你试过什么?我可以想象它涉及计算树的属性(深度、宽度等)、布局计算和生成 ASCII 艺术。
-
@SimeonVisser 添加了一些损坏的代码
-
看到这个让我觉得你也应该跟踪树的深度。我有一些基于您损坏的代码的基本代码,但看起来很糟糕。对于每一行,我试图弄清楚它应该有多少额外的空间,但该行的重建目前只占最低的分支
-
您是否考虑过使用graphviz 语言对树进行序列化?有很多布局/渲染工具可以理解这种格式
-
@J.F.Sebastian 我真的很想避免外部依赖,虽然我是graphviz的粉丝
标签: python tree formatting