Algorithm 如何用n个叶计算叶数?

Algorithm 如何用n个叶计算叶数?,algorithm,recursion,tree,Algorithm,Recursion,Tree,假设我有一棵树,每个节点可以有0-3个叶子 我想遍历树,并返回一个元组(a,b,c),其中a=具有1个叶的节点,b=具有2个叶的节点,以及c=具有3个叶的节点 我的通用代码是递归的,如下所示: 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 t

假设我有一棵树,每个节点可以有0-3个叶子

我想遍历树,并返回一个元组
(a,b,c)
,其中
a=具有1个叶的节点
b=具有2个叶的节点
,以及
c=具有3个叶的节点

我的通用代码是递归的,如下所示:

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中使用临时变量,所以我似乎无法绕过它



有没有关于实现这一功能的最佳方法的想法?我试图坚持递归,并考虑在节点数不同的情况下调用不同的函数,但这意味着要多次遍历树,我不希望它效率低下。

有类似的情况吗

伪代码:

# 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)

这算的是后代,而不是叶子,但问题似乎是以同样的方式误用了“叶”一词。@Jasen哦-叶是零度节点吗?叶总是有零个后代@Jasen感谢您的澄清。我把“叶子”改成了“子树”