Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找树的最大高度并返回该路径的总和_Python - Fatal编程技术网

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

Python 查找树的最大高度并返回该路径的总和,python,Python,我想先求一棵树的最大高度,然后求它所有节点的和 如果两条路径的高度相同,则只返回总和较大的路径 对不起,我的坏例子。。。我想表达的是一棵像上面这样的树 应该有类似于[1,2,无,无],[3,无,无]]的树列表,而不是[1,2,3]这些值是权重吗?树是否以任何方式排序(树是否有特定的顺序) 如果是这样的话,也许你可以做一个修改版本,在每个交叉点取最长的距离,而不是最短的距离,并且使用堆栈代替最小优先级队列,这样你就可以遍历深度优先而不是宽度优先 编辑: 现在我考虑一下,也许使用最大优先级队列会更好

我想先求一棵树的最大高度,然后求它所有节点的和

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

对不起,我的坏例子。。。我想表达的是一棵像上面这样的树


应该有类似于
[1,2,无,无],[3,无,无]]
的树列表,而不是
[1,2,3]

这些值是权重吗?树是否以任何方式排序(树是否有特定的顺序)

如果是这样的话,也许你可以做一个修改版本,在每个交叉点取最长的距离,而不是最短的距离,并且使用堆栈代替最小优先级队列,这样你就可以遍历深度优先而不是宽度优先

编辑:


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

Egg推荐的递归函数:

   1
 2   3
        returns 1 + 3 = 4
例如:

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
抱歉,如果它很快又脏,但它可以工作。问题其实并不是那么简单,特别是对于编程/python的初学者来说。我希望这是可以理解的


编辑:现在先检查深度,然后检查总和。

请发布您目前拥有的代码,以便我们可以看到您可能正在做的不正确的事情确定递归。这是一个很容易用递归函数解决的问题。似乎有点不必要。无论它们是否为权重,它都是一棵树,简单的遍历不是更简单吗?您只需按顺序遍历树,并记住迄今为止所走的最长路径。我们需要更多信息,如果对树进行排序,我们可以在搜索的每个级别进行选择,并确保路径的总和最大(这是我认为他想要的)还有,什么是“简单”遍历?遍历一棵树有不同的方法,每种方法都有特定的目的。对我来说,任何深度优先遍历似乎都是最简单的方法。最简单的方法并不总是最有效的。如果树有顺序,你可以在搜索的任何给定点对给定的过去/现在信息的总和进行假设,并避免搜索不需要的树的g部分。整棵树上的DFS没有性能。算法的最坏情况复杂度是什么?这会最终遍历整棵树以找出答案吗?代码对我来说很难理解..但我注意到我的树形式完全混乱。它应该是[1,2,3]因为1是根2-左子3-右子和树[1,None,None]意味着它只有根1,没有children@ChristopherPerry:是的,在所有情况下都是:)我只是注意到我没有检查最大的总和和最大的深度(在编辑中更改)。请求的是一个简单的方法,而不是最快的。@user3417260:这毫无意义。。。整个树必须以某种方式包含在单个数据结构中(例如列表)。请编辑并重新表述您的问题。@loli:很抱歉我的错误示例。。。我想表达的是,像1/\23这样的树应该有像
[1,2,None,None],[3,None,None]
这样的树,而不是
[1,2,3]
3, 7 
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)