给定一个n-ary树,我们如何计算根据特定节点并包含至少一个边缘的所有可能子树的数量。
答案 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
的三个孩子,b
,c
和n
,其中可能的子树集合为A
,{{1 }和B
。然后C
的可能子树集合是
n
使用基数N = { {n} x A x B x C } + {}
。
现在,对于树的根,我们需要消除两种情况:
|N| = |A| * |B| * |C| + 1
因此:
n
是否正确重复计算给定节点的可能子树数