【问题标题】:While recursively finding max path sum, append left or right direction of binary tree在递归查找最大路径和时,附加二叉树的左或右方向
【发布时间】:2019-08-11 06:51:53
【问题描述】:

我正在创建 python 代码来识别二叉树的最大(节点总和)路径。在遍历树的同时,我想将路径方向(“l”或“r”分别表示左右)附加到一个列表中,以便稍后在代码中调用。

到目前为止,我设法正确地获得了最大路径(节点的最大总和)和第一个路径方向,但不是完整路径。

我觉得我快完成这项工作了,只需要一个正确方向的提示。

def sum_max_path(root):

    if not root:
        return

    if root.left is None:
        l_sum = 0
    else:
        l_sum = sum_max_path(root.left)

    if root.right is None:
        r_sum = 0
    else:
        r_sum = sum_max_path(root.right)

    if l_sum > r_sum:
        root.list.append("l")
        return root.value + l_sum
    elif l_sum < r_sum:
        root.list.append("r")
        return root.value + r_sum
    else:
        root.list.append("l")
        return root.value + l_sum

    return root.value + max(l_sum, r_sum)

return sum_max_path(root), root.list

这个的输出是:

The total value in this path is: 8
The largest value path is: ['l']

如果输出是我想要的:

The largest value path is ['l', 'r', 'l'] 

(显然取决于路径基于生成树的长度)。

【问题讨论】:

    标签: python binary-tree binary-search-tree


    【解决方案1】:

    不要静态存储路径,而是将其传递给并从每个递归调用中返回:

    def max_sum(node, path):
        ls = rs = 0
        lp = rp = path
        if node.left:
            ls, lp = max_sum(node.left, path + ['l'])
        if node.right:
            rs, rp = max_sum(node.right, path + ['r'])
        ls += node.value
        rs += node.value
        return (ls, lp) if ls > rs else (rs, rp)
    

    完整示例:

    class Node:
        def __init__(self, value, left=None, right=None):
            self.value = value
            self.left = left
            self.right = right
    
    
    tree = Node(
        1,
        Node(
            9,
            Node(2),
            Node(3)
        ),
        Node(
            8,
            Node(2),
            Node(
                5,
                Node(3),
                Node(2)
            )
        )
    )
    
    
    def max_sum(node, path):
        ls = rs = 0
        lp = rp = path
        if node.left:
            ls, lp = max_sum(node.left, path + ['l'])
        if node.right:
            rs, rp = max_sum(node.right, path + ['r'])
        ls += node.value
        rs += node.value
        return (ls, lp) if ls > rs else (rs, rp)
    
    
    print(max_sum(tree, []))
    

    【讨论】:

    • 嘿乔治,感谢分享,您介意扩展您的答案吗?
    • @Neelhtak:你不明白哪一部分?您的代码的唯一区别是 path 被传递。
    • 嘿 Georg,你上面的例子和我的完全不同。当我尝试将“路径”添加到我的代码中并稍后调用“max_sum”时,它需要输入路径 - 我没有?如何返回“路径”?
    • @Neelhtak:添加了一个完整的例子
    • 嘿 Georg,这非常有用!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多