我正在try 解决一个寻找二叉树最大路径和的问题.我会张贴问题陈述.

写一个函数,接受一个二叉树并返回它的最大路径和.路径是树中连接 node 的集合,其中没有 node 连接到两个以上的其他 node ;路径和是 一个特定路径中 node 的值的总和.每个BinaryTree node 都有一个整数值,一个左子 node 和一个右子 node .子 node 可以是 BinaryTree node 本身或None / null.

我需要帮助来解决这个问题.我没有什么 idea ,但我还没有接近于起草解决方案,或者逻辑没有直接转换为代码.

在迭代中可能是最大路径和的答案

  • 单独的根
  • 单独的根 with a left max path
  • 单独的根 with a right max path
  • 左子树中的一些双路径/三角形
  • 右子树中的某些双路径/三角形

因此,有两种情况:

  • attachablePath(可以添加根 node 并比较其和是否更大的路径类型)
  • unattachablePath(以根作为子树中的子级之一的三角形路径的路径类型)

我想我需要一个函数来返回这两者,这样调用它们的根 node 就可以决定 哪个对他们更有利 现在我们可能会比较并弄清楚这两种 Select

    bestAttachable = max of leftattachablePath + root, rightAttachablePath + root
    bestUnattachable = max of leftUnattachable, rightUnattachable, root, leftattachable + root + unattachable.

这说得通吗? 请帮我以正确的方式思考这件事.我觉得我错过了一些可能会出错的东西.或不确定 如何有效地将逻辑转换为代码.

我试过这个

def maxPathSum(tree):
    # Write your code here.
    maxA, maxB = helper(tree)
 #   print(maxA, maxB)
    return max(maxA, maxB)
    pass


def helper(node):
    if node is None:
        return 0, float("-inf")
    left_attachable, left_unattachable = helper(node.left)
    right_attachable, right_unattachable = helper(node.right)

#    print('left is ', left_attachable, ' right is ', right_attachable)
    max_attachable = max( left_attachable+node.value, right_attachable+node.value, node.value)
    print(node.value, left_unattachable, right_unattachable, left_attachable, right_attachable)
    max_unattachable = max(left_unattachable, right_unattachable, left_attachable+node.value+right_attachable, node.value)

    return max_attachable, max_unattachable



但在Right_attacable或Left_attacable为最大值的情况下,此操作会失败.此外,我已经将attacable的基本情况设置为0,但当树具有所有负 node 时,max是所有 node 中最小的,但不是0,但我不能将-inf也设置为attacable,因为当我将 node 附加到它时,它应该是 node 值的大小.

推荐答案

(下面是未经测试的.)在我看来,正如您所指出的,我们需要一个包装器方法,因为Main方法只返回一个值,如果它引用了当前 node 无法到达的路径段,我们就无法与之区分开来.类似于:

f(tree):
  max_attachable, max_unattachable = g(tree)

  return max(
    max_attachable,
    max_unattachable
  )

对于帮助器方法,如果我们在任何一个 node 上,解决方案不能是

if node is null:
  return -Infinity, -Infinity

l_attachable, l_unattachable = g(node.left)
r_attachable, r_unattachable = g(node.right)

max_attachable = max(
  node.value,
  l_attachable + node.value,
  node.value + r_attachable
)

max_unattachable = max(
  l_attachable + node.value + r_attachable,
  l_attachable,
  r_attachable,
  l_unattachable,
  r_unattachable
)

return max_attachable, max_unattachable

Python相关问答推荐

计算每月过go x年的平均值

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

将numpy数组与空数组相加

Pandas滚动分钟,来自其他列的相应值

Twilio:CallInstance对象没有来自_的属性'

Python主进程和分支进程如何共享gc信息?

jit JAX函数中的迭代器

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

如何使用symy打印方程?

Pandas 有条件轮班操作

将输入管道传输到正在运行的Python脚本中

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

在极性中创建条件累积和

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

为什么if2/if3会提供两种不同的输出?

幂集,其中每个元素可以是正或负""""

如何在BeautifulSoup/CSS Select 器中处理regex?

Python—转换日期:价目表到新行

合并与拼接并举

在matplotlib中使用不同大小的标记顶部添加批注