出力が次のようになるように、バイナリ ツリーを横に印刷するにはどうすればよいでしょうか。
__/a
__/ \b
\ _/c
\_/ \d
\e
(きれいなアスキー アートを歓迎)
うまく動かないコードを次に示します。
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
}
}
}