1
2 3
returns 1 + 3 = 4
我想首先找到树的最大高度,然后找到所有节点的总和。
如果两条路径的高度相同,则只返回总和较大的路径。
对不起我的坏例子...我想表达的是像上面的一棵树
应该有[1, [2, None, None], [3, None, None]]
而不是[1,2,3]
答案 0 :(得分:1)
Egg推荐的递归函数:
def sum_of_longest_branch(tree):
"""
Parses a tree and returns a tuple containing (depth, sum) of deepest branch.
"""
# stop conditions on leave nodes (can be single [node] or None)
if 1 == len(tree):
return 1, tree[0]
elif None == tree:
return 1, 0
# splitting the branches
else:
# calling the function recursively on all branches branching from current node
branches_sums = [sum_of_longest_branch(branch) for branch in tree[1:]]
# extracting the currently deepest branch
branch, sum = sorted(branches_sums, reverse=True)[0]
# add own node value and one depth before returning
return branch + 1, sum + tree[0]
示例:
tree = [1, [2, [4]], [3, [0]]]
depth, sum = sum_of_longest_branch(tree)
print depth, sum
给出:
3, 7
很抱歉,如果它很快&脏,但它的工作原理。问题实际上并不是那么微不足道,特别是对于编程/ python的初学者。我希望它是可以理解的。
编辑:现在首先检查深度,然后检查总和。
答案 1 :(得分:1)
def tree_height(tree):
if (isinstance(tree, list)):
tree = tree[1:]
if (tree):
return (1 + max([tree_height(x) for x in tree]))
return 0
def tree_sum(tree):
if tree and (isinstance(tree, list)):
return tree[0] + sum([tree_sum(x) for x in tree[1:]])
return (tree or 0)
答案 2 :(得分:0)
这些值是否为权重?树是否以任何方式排序(树的特定顺序)?
如果是这样,也许您可以执行Dijkstra's Algorithm的修改版本,其中您在每个交汇点采用最长距离而不是最短距离,而不是最小优先级队列使用堆栈,因此您首先遍历深度广度优先。
编辑:
现在我考虑一下,也许使用最大优先级队列会更好。我仍然不确定你想要完成什么。我认为你要求的是具有最大总和的路径,这并不一定意味着它将是具有最多节点的分支。具有最多节点的路径,假设每个节点看起来具有权重,似乎没有意义,因为可能存在具有更大权重的更短路径。