在二叉树中查找最大路径的Python算法未按预期工作
我试图编写一个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:
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))
这段代码对这个问题做出了一些错误的假设,这解释了为什么它不能像您所期望的那样工作
3
7 4
2 4 6
8 5 9 3
我们可以观察节点之间的以下关系:
3
/ \
↓ ↓
7 4
/ \ / \
↓ ↓ ↓
2 4 6
/ \ / \ / \
↓ ↓ ↓ ↓
8 5 9 3
因为每个内部节点都有两个子节点,所以必须(可以理解)得出它是一棵树的结论。但是树的定义是每个孩子只有一个父母,所以我们有一个矛盾。这实际上是一个错误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)