Algorithm 如何用n个叶计算叶数?
假设我有一棵树,每个节点可以有0-3个叶子 我想遍历树,并返回一个元组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
(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感谢您的澄清。我把“叶子”改成了“子树”