如何在其一側打印二叉樹以使輸出看起來像這樣?在其一側打印二叉樹
__/a
__/ \b
\ _/c
\_/ \d
\e
(更漂亮ASCII藝術歡迎)
下面是一些代碼,完全不是那麼回事:
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
範圍蠕變:這將是e xcellent如果你可以傳入一個函數來返回字符串來打印任何節點;通過這種方式,我有時也可以打印有關非離開節點的信息。因此,節點是否有任何要打印的內容是由作爲參數傳入的函數來控制的。
這裏的一些測試數據在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添加了一些破損的代碼 – Will
看着這讓我覺得你也應該跟蹤樹的深度。我有一些基於你的破解代碼的基本代碼,但它看起來很糟糕。對於每一行,我試圖弄清楚它應該有多少額外的空間,但是那一行的重建目前僅佔最低分支 – Michael