给定二叉树,使用scipy打印所有根到叶路径

时间:2016-10-17 16:29:32

标签: python tree scipy

我正在使用scipy中的hierarchy.to_tree,并且我有兴趣从所有根到叶路径中打印出来:

enter image description here

10.8.3 10.8.5 10.2.2

from scipy.cluster import hierarchy
a = hierarchy.to_tree(linkage_matrix)

我试了一下

linkage_matrix
[[2, 3, 0.06571365, 2], [0, 10, 0.07951425, 2], [5, 6, 0.09405724, 2], [11, 13, 0.10182075, 3], [1, 12, 0.12900146, 3], [14, 15, 0.13498948, 5], [8, 9, 0.16806049, 2], [7, 16, 0.1887918, 4], [17, 19, 0.2236683, 9], [18, 20, 0.29471335, 11], [4, 21, 0.45878, 12]]

from scipy.cluster import hierarchy
a = hierarchy.to_tree(linkage_matrix)

def parse_tree(tree, path):
    path = path
    if path ==[]:
        path.append(str(tree.get_id()))
    if tree.is_leaf() is False:
        left = tree.get_left()
        left_id = str(left.get_id())
        if left.is_leaf() is False:
            path.append(left_id)
            parse_tree(left, path)
            path.pop()
        else:
            parse_tree(left, path)
        right = tree.get_right()
        right_id = str(right.get_id())
        if right.is_leaf() is False:
            path.append(right_id)
        parse_tree(right, path)
    else:
        path.append(str(tree.get_id()))
        print(('.').join(path)) 
        path.pop()

parse_tree(a, [])

但显然我的逻辑是完全错误的,特别是当左节点不是休假时它会崩溃(22.21.20.17.15.19.7应该是22.21.20.19.7)。我正在寻找新方法,我没有考虑过。

对于以下示例树,所有根到叶路径都是:

1 个答案:

答案 0 :(得分:3)

不看你的代码,你应该做的事情如下:

print_paths(tree, seen):
    seen = seen
    seen.append(tree.value)
    if not tree.children:
        print(seen)
    else:
        map(print_paths, tree.children)

现在看到你的代码,尝试类似:

def parse(tree, p):
    path = p[:]
    path.append(str(tree.get_id()))
    if tree.is_leaf():
        print('.'.join(path))
    else: 
        #Here I assume get_left() returns some falsey value for no left child
        left = tree.get_left()
        if left:
            parse(left, path)
        right = tree.get_right()
        if right:
            parse(right, path)