如何计算n片叶子的数量?

时间:2016-11-16 17:08:44

标签: algorithm recursion tree

让我们说我有一棵树,每个节点可以有0到3片叶子。

我想浏览树,并返回(a, b, c)a = nodes with 1 leafb = nodes with 2 leafs所在的元组c = nodes with 3 leafs

我的通用代码是递归的,看起来像这样:

treeNode(tree, (a, b, c)) =
  if tree = Empty
    return (a, b, c)
  else if tree = Node(n1, n2, n3)
    if n1 = tree and n2 = tree and n3 = tree
      treeNode(n1, (a, b, c + 3)) + treeNode(n2, (a, b, c + 3)) + treeNode(n3, (a, b, c + 3))
    else if ...

那时,我不知道该怎么做。我被困在两个部分上。

a)如何在没有重叠的情况下三次调用递归函数?当有两个节点时,我猜是增加1/3而不是3和1/2而不是2?

b)我怎样才能最终将它们全部加在一起?每次有三个节点时,我得到三个(a,b,c)的单独元组,两个节点有两个元组,依此类推。我无法在SML中使用临时变量,所以我似乎无法绕过它。

有关实现此功能的最佳方法的任何想法?我试图坚持递归,我想在有不同数量的节点时调用不同的函数,但这意味着不止一次遍历树,我不希望它效率低下。

1 个答案:

答案 0 :(得分:3)

这些方面的东西?

伪代码:

# returns triple (a,b,c) of counts of nodes with 1,2 and 3 subtrees
f(T):
  result = (0,0,0)

  if T.nodes.length == 0:
    return result

  for node in T.nodes:
    combine result with f(node)

  result[ T.nodes.length ] += 1

  return result

示例:

         Node # returns answer (0,1,1) + 1 in position a = (1,1,1)
        /
       Node   # returns (0,0,0) + (0,0,1) + 1 in position b
      /    \
    Node    Node  # return (0,0,0) and (0,0,1)
           / | \
          N  N  N  # each return (0,0,0)