让我们说我有一棵树,每个节点可以有0到3片叶子。
我想浏览树,并返回(a, b, c)
,a = nodes with 1 leaf
和b = 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中使用临时变量,所以我似乎无法绕过它。
有关实现此功能的最佳方法的任何想法?我试图坚持递归,我想在有不同数量的节点时调用不同的函数,但这意味着不止一次遍历树,我不希望它效率低下。
答案 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)