Java算法,用于在二叉树中查找最大的独立节点集

时间:2009-10-14 16:41:28

标签: java algorithm binary-tree

通过独立节点,我的意思是返回的集合不能包含直接关系的节点,不能同时包含父节点和子节点。我试图使用谷歌,但没有成功。我认为我没有正确的搜索词。

一个链接,任何帮助将非常感谢。刚刚开始这个。

我需要返回实际的独立节点集,而不仅仅是金额。

3 个答案:

答案 0 :(得分:6)

您可以使用动态编程(memoization)计算此递归函数:

MaxSet(node) = 1 if "node" is a leaf
MaxSet(node) = Max(1 + Sum{ i=0..3: MaxSet(node.Grandchildren[i]) },  
                       Sum{ i=0..1: MaxSet(node.Children[i])      })

这个想法是,您可以选择一个节点或选择不选择它。如果你选择它,你不能选择它的直接孩子,但你可以从其孙子中选择最大的一组。如果您不选择它,您可以从直接儿童中挑选最大值。

如果您需要设置本身,您只需存储每个节点选择“最大”的方式。它类似于LCS algorithm

该算法为O(n)。它一般适用于树木,而不仅仅是二叉树。

答案 1 :(得分:0)

我会先取下所有树叶,同时将其父母标记为不要采取,然后移除所有标记的树叶,直到没有留下这些树叶为止,然后递归直到树空。我没有证明这总是产生最大可能的集合,但我相信它应该。

答案 2 :(得分:0)

我为同一个问题提供了answer问题,虽然解决方案是在python中,但解释,算法和测试用例都适用。