通过独立节点,我的意思是返回的集合不能包含直接关系的节点,不能同时包含父节点和子节点。我试图使用谷歌,但没有成功。我认为我没有正确的搜索词。
一个链接,任何帮助将非常感谢。刚刚开始这个。
我需要返回实际的独立节点集,而不仅仅是金额。
答案 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中,但解释,算法和测试用例都适用。