找到树中最长(最深)的链并总结TreeNodes?

时间:2014-03-13 23:57:49

标签: python

这里我有一些代码,它会给我一棵树的深度。

if isinstance(t, list):
        return 1 + max(depth(item) for item in t)
    else:
        return 0

树的形式为:

element 1 is an integer
element 2 is another treelist or None
element 3 is another treelist or None

ex: [1,[1,None,None],None]

example: tree = [12, [1, None, None], [3, [4, None, None], [2, None, None]]]

我的目标是对导致最深节点的所有节点求和,如果有多个深度相同的节点,那么只有最大的总和(max?)。我可以编写一个函数来总结所有节点,但不仅仅是导致最深节点的特定链......我一直在困扰我的大脑并且无法找到解决方案。

我想到了一种方法,那就是通过一个包含左右的列表来跟踪链。所以它会是:

[left,right,left]

我将用它来总结:

t[0] + t[1] + t[1][0]+ t[1][0][2] . . . and so on, but that seems overly complicated..

有什么想法吗?

编辑: 想到另一种方式: 将每个可能链的每个组合存储为列表中的列表,并使用我所做的深度函数仅比较相似长度(深度)的列表,然后获取这些列表的最大总和。我仍然遇到同样的问题,我不知道如何抓住个别连锁店。也似乎效率低下

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是递归的 - 在树中的每个节点,答案是当前节点的值加上左或右子的值,具体取决于哪个更深(或者具有更大的总和,如果它们是相同的最大深度)。

VALUE, LEFT, RIGHT = 0, 1, 2

def get_deepest_max_sum(node):
    if node is None:
        return 0, 0
    else:
        deepest, most = max(get_deepest_max_sum(node[LEFT]), get_deepest_max_sum(node[RIGHT]))
        return 1+deepest, node[VALUE]+most

tree = [12, [1, None, None], [3, [4, None, None], [2, None, None]]]
print(get_deepest_max_sum(tree))

给出了

(3, 19)   # => depth 3, sum 19

答案 1 :(得分:0)

同样精神但更长;也许更容易理解......

tree = [12, [1, None, None], [3, [4, None, None], [2, None, None]]]

mx=0
depth=0

def walk(t,m=0,l=0):
    global mx, depth
    l += 1
    m += t[0]
    for b in t[1:]:
        if b:
            walk(b,m,l)
        else:
            print "level",l,"maximum",m
            if m > mx:
                mx = m
            if l > depth:
                depth = l


walk(tree)
print depth,mx