在二叉树中查找最大路径的Python算法未按预期工作

在二叉树中查找最大路径的Python算法未按预期工作,python,tree,binary,Python,Tree,Binary,我试图编写一个Python算法,该算法将在二叉树中找到整数路径的最大和。我认为实现这一点最简单的方法是递归函数,但这似乎不是我想要的方式。如何修改此函数,使其找到绝对最大路径?我可以确认,到目前为止,构建这棵树的工作正常,因为我为它编写的高度函数按预期工作 class Node: def __init__(self, data): self.right = self.left = None self.data = data class Solution:

我试图编写一个Python算法,该算法将在二叉树中找到整数路径的最大和。我认为实现这一点最简单的方法是递归函数,但这似乎不是我想要的方式。如何修改此函数,使其找到绝对最大路径?我可以确认,到目前为止,构建这棵树的工作正常,因为我为它编写的高度函数按预期工作

class Node:
    def __init__(self, data):
        self.right = self.left = None
        self.data = data

class Solution:
    def insert(self, root, data):
        if not root:
            return Node(data)
        else:
            if data<=root.data:
                cur=self.insert(root.left, data)
                root.left=cur
            else:
                cur=self.insert(root.right, data)
                root.right=cur
        return root

def get_height(self, root):
    if not root or root.left == root.right == None:
        return 0
    return 1 + max(self.get_height(root.left), self.get_height(root.right))

def get_max_sum(self, root):
    if not root:
        return 0
    return root.data + max(self.get_max_sum(root.left), self.get_max_sum(root.right))

这段代码对这个问题做出了一些错误的假设,这解释了为什么它不能像您所期望的那样工作

  • 输入是a,而不是。查看此示例输入,其中要求我们查找最大根到叶路径

    3
    7 4
    2 4 6
    8 5 9 3
    
    我们可以观察节点之间的以下关系:

    3
    / \
    ↓   ↓
    7   4
    / \ / \
    ↓   ↓   ↓
    2   4   6
    / \ / \ / \
    ↓   ↓   ↓   ↓
    8   5   9   3
    
    因为每个内部节点都有两个子节点,所以必须(可以理解)得出它是一棵树的结论。但是树的定义是每个孩子只有一个父母,所以我们有一个矛盾。这实际上是一个错误

  • 即使它是一棵树,使其成为BST也会从根本上改变其结构。再次考虑上述输入。在其上运行
    insert
    算法将生成以下结构:

    3
    / \
    /   \
    /     \
    2       7
    \     / \
    3   4   8
    / \   \ 
    4   6   9
    /
    5.
    
    显然,该结构与原始输入没有什么关系,在该结构上运行最大路径和算法将产生
    3+7+8+9=27
    ,而正确答案是
    3+7+4+9=23


  • 我建议将问题重新表述为一个图形问题,并从那里开始。

    这是根到叶的路径,还是@ggorlen它应该是根到最后一片叶的路径,因此遍历整个树。我认为它目前正在这样做,但它找到的值不是sumroot到“最后一片叶子”的最大路径?你是指任何一片叶子,也就是提供最大路径的叶子吗?@trincot是的,但考虑到我拥有的树的结构(叶子是随机值为0-99的整数的金字塔),它总是最后一片叶子,因为这是走最多叶子的路径“走最多叶子”。如果它是根到叶的路径,那么该路径如何可以到达多个叶?我很困惑。您是否可以显示预期的I/O,或者一个树形图来说明您试图实现的目标?
     nums = '''75
        95 64
        17 47 82
        18 35 87 10
        20 04 82 47 65
        19 01 23 75 03 34
        88 02 77 73 07 63 67
        99 65 04 28 06 16 70 92
        41 41 26 56 83 40 80 70 33
        41 48 72 33 47 32 37 16 94 29
        53 71 44 65 25 43 91 52 97 51 14
        70 11 33 28 77 73 17 78 39 68 17 57
        91 71 52 38 17 14 91 43 58 50 27 29 48
        63 66 04 68 89 53 67 30 73 16 69 87 40 31
        04 62 98 27 23 09 70 98 73 93 38 53 60 04 23'''.replace('\n', ' ')
        nums = tuple(map(int, nums.split(' ')))
    
        tree = Solution()
        root = None
        for i in nums:
            data = i
            root = tree.insert(root, data)
    
        height = tree.get_height(root)
        msum = tree.get_max_sum(root)
        print(height, msum)