计算可能的子树数

时间:2017-09-02 18:11:55

标签: algorithm graph tree dynamic-programming

给定一个n-ary树,我们如何计算根据特定节点并包含至少一个边缘的所有可能子树的数量。

1 个答案:

答案 0 :(得分:0)

通过DFS遍历树并计算每棵树的可能子树数:

def _count_subtrees(node):
    result = 1

    # multiply the number of possibilities for each subtree
    # to get the total number of possible subtrees
    while node.has_more_children():
        result *= count_subtrees(node.next_child())

    # allow the empty subtree
    return result + 1

def count_subtrees(node):
    # two of the counted subtrees are invalid: the tree containing only
    # the root and the empty tree
    return _count_subtrees(node) - 2

给定节点的可能子树数是可以从所有子节点相乘的可能子树的数量相乘。

考虑一个节点a的三个孩子,bcn,其中可能的子树集合为A,{{1 }和B。然后C的可能子树集合是

n

使用基数N = { {n} x A x B x C } + {}

现在,对于树的根,我们需要消除两种情况:

  • 空子树
  • 仅包含|N| = |A| * |B| * |C| + 1
  • 的子树

因此:

n

是否正确重复计算给定节点的可能子树数