这里我有一些代码,它会给我一棵树的深度。
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..
有什么想法吗?
编辑: 想到另一种方式: 将每个可能链的每个组合存储为列表中的列表,并使用我所做的深度函数仅比较相似长度(深度)的列表,然后获取这些列表的最大总和。我仍然遇到同样的问题,我不知道如何抓住个别连锁店。也似乎效率低下
答案 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