查找给定(不一定是二进制)树

时间:2017-01-17 19:27:07

标签: algorithm tree binary-tree dynamic-programming graph-theory

我在节点上给出了一个(不一定是二进制)树,其中包含整数(正/负)标签,并且必须找到最大化树中标记总和的二进制子树。我想到了动态编程方法 - 我定义了f(u)返回所有以u为根的二叉树的最大总和,并通过选择v,w来计算f(u),使得v,w是u的子项,并且它们最大化sum(f(v)+ f(w))对所有u的子对,然后f(u)= label(u)+ f(v)+ f(w)。 f可以通过典型的动态编程方法从叶片中计算出来。我的问题是:

(1)有更有效的方法吗? (2)似乎最昂贵的一步是找到你孩子的所有对子中的最大值 - 如果你有n个孩子,成本是O(n ^ 2),但我认为对于整个树来说它小于O(| E | ^ 2),是真的吗?如何更紧密地计算成本呢?

感谢。

1 个答案:

答案 0 :(得分:2)

如果节点U具有 n 子节点,则可以通过简单地取最大化f(V)和f(W)的子节点来找到最大化f(U)的子节点V,W。您不需要实际检查每对。您可以在O(2 )= O( n )中轻松完成此操作而不需要O( n 2 )。

例如,如果子节点具有f值{6,5,2,12,8},那么您只需要两个最大值,即8和12.您不需要实际检查每对值并明确添加它们。

(注意:如果任一选定节点的f值为负,那么你应该放弃它。你的二叉树是否允许内部节点只有一个子节点?)