Algorithm 从树中选择K个节点的方法的数量,以便在选择节点时必须选择节点的父节点

Algorithm 从树中选择K个节点的方法的数量,以便在选择节点时必须选择节点的父节点,algorithm,tree,language-agnostic,tree-traversal,Algorithm,Tree,Language Agnostic,Tree Traversal,我试图解决这个问题,我有一棵树,每个节点可以有任意数量的子节点。我必须找到所有可能的方法来选择K个节点,这样任何节点只有在其父节点被选中时才会被选中 我试过了,但没能找到解决办法。有人能帮我吗?基本算法(伪代码)就足够了。我们可以使用DFS来解决这个问题。把每个可能的选择视为一个图的顶点。如果我们可以通过从选择中删除一个顶点并向选择中添加另一个有效的树节点,将一个选择转化为另一个选择,则两个顶点/选择之间会相应地存在一条边。这个图是连通的,因此我们可以通过DFS遍历它 例如: 因为我们需要一个起

我试图解决这个问题,我有一棵树,每个节点可以有任意数量的子节点。我必须找到所有可能的方法来选择K个节点,这样任何节点只有在其父节点被选中时才会被选中


我试过了,但没能找到解决办法。有人能帮我吗?基本算法(伪代码)就足够了。

我们可以使用DFS来解决这个问题。把每个可能的选择视为一个图的顶点。如果我们可以通过从选择中删除一个顶点并向选择中添加另一个有效的树节点,将一个选择转化为另一个选择,则两个顶点/选择之间会相应地存在一条边。这个图是连通的,因此我们可以通过DFS遍历它

例如:

因为我们需要一个起始顶点,为了产生其他顶点,我们需要一个有效的选择来开始。最简单的解决方案是遍历树的前序并选择第一个
K
节点

从该起始顶点开始,我们可以在运行时生成整个图形:
基本上,每个节点都包含输入树中的一个子树,即选择树。从刚刚遍历的节点中获取所选内容。通过从选择所表示的子树中移除任意叶,我们获得了一个具有
K-1
节点的子树/选择。通过将另一个节点添加到子树(将成为新叶)中,可以完成对
K
节点的选择。这种方法也将匹配上面给出的边定义


现在我们知道如何从给定的顶点/选择中生成所有相邻顶点。剩下的只是一个简单的DFS遍历。将顶点标记为已访问,获取所有相邻顶点,并对其执行DFS遍历,直到所有顶点都已访问。

问题的标题和问题本身是两个不同的问题。是哪一个?@Gene很抱歉,现在怎么样?更清楚吗?我需要找出所有可能的方法来选择这样的K节点。“普通的预订单会怎么样?”纳曼:好吧,在这种情况下,你应该在你的问题中说明。这个解决方案的时间复杂度是多少?因为您提到每个节点都是一个选择。所以在这样的图中可能有很多边,甚至检查访问的结果都是O(K)。你能详细说明你的解决方案吗?@Naman该图只包含有效选择的顶点,因此不能减少。最坏的情况是
O(n^2)
检查每个顶点是否彼此连接顶点/解决方案。我可以试着进一步解释这个算法——或者至少试着解释一下。确实是O(n^2),但选择本身的数量会很大,在原始图中可能是指数的节点数量,对吗?虽然我同意,但我不能做得比O更好。虽然如果你能解释一下这个算法,那会很有帮助。
input tree:       1              K=3
               /  |  \
              3   4   5
                /   /   \
               6   7     2

first solution (preorder traversal):
         1
      /  |
     3   4

consecutive solutions:
    removing node 3 from selection   removing node 4
         1         1                       1
         |         |  \                  /   \
         4         4   5                3     5
       /
      6