【问题标题】:Java Algorithm for finding the largest set of independent nodes in a binary tree用于在二叉树中查找最大独立节点集的 Java 算法
【发布时间】:2009-10-14 16:41:28
【问题描述】:

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

一个链接,任何帮助将不胜感激。现在才开始做这个。

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

【问题讨论】:

    标签: java algorithm binary-tree


    【解决方案1】:

    您可以使用动态编程(记忆)计算这个递归函数:

    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])      })
    

    这个想法是,您可以选择一个节点或选择不选择它。如果选择它,则不能选择其直系子代,但可以从其孙代中选择最大集。如果你不选择它,你可以从直接孩子那里选择最大集。

    如果您需要集合本身,您只需存储为每个节点选择“Max”的方式。它类似于LCS algorithm

    这个算法是 O(n)。它通常适用于树,而不仅仅是二叉树。

    【讨论】:

    • 计算最大集合的大小,而不是集合本身。
    • 我需要返回实际节点,而不仅仅是最大值。我将编辑我的帖子。
    • 编辑以计算实际集合。
    • 这看起来很不错,但这真的很高级。 Sum 和 max 我以前没有见过,我没有直接看到我将如何存储值来检索集合?
    • i=0..3: MaxSet(node.Grandchildren[i]) i=0..1: MaxSet(node.Children[i]) 你或有人能为我解释一下吗?
    【解决方案2】:

    我会先取出所有叶子,同时将它们的父母标记为不采,然后删除所有标记的叶子,直到没有留下这样的叶子,然后递归直到树为空。我没有证据表明这总是会产生尽可能大的集合,但我相信它应该。

    【讨论】:

    • 啊,你有点从底部到根部每隔一个高度?不错!我去实现它看看。
    • 叶子不需要在同一层。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多