查找树的最大高度并返回该路径的总和

时间:2014-03-13 20:25:53

标签: python

   1
 2   3
        returns 1 + 3 = 4

我想首先找到树的最大高度,然后找到所有节点的总和。

如果两条路径的高度相同,则只返回总和较大的路径。

对不起我的坏例子...我想表达的是像上面的一棵树

应该有[1, [2, None, None], [3, None, None]]而不是[1,2,3]

之类的树状列表

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的修改版本,其中您在每个交汇点采用最长距离而不是最短距离,而不是最小优先级队列使用堆栈,因此您首先遍历深度广度优先。

编辑:

现在我考虑一下,也许使用最大优先级队列会更好。我仍然不确定你想要完成什么。我认为你要求的是具有最大总和的路径,这并不一定意味着它将是具有最多节点的分支。具有最多节点的路径,假设每个节点看起来具有权重,似乎没有意义,因为可能存在具有更大权重的更短路径。