您提供的方法无法正常工作,因为您总是在 for 循环的第一次迭代期间返回一个值。假设你有一个数组 [D]。然后 checkSubstitute(B) 返回 True,而它应该返回 False。
与其使用 for 循环,不如对两个孩子进行两次显式调用更容易。这假设每个节点都有零个或两个子节点。如果一个节点可以有一个子节点,则需要进行一些额外的空值检查。
#returns true if Node n exists in NodeList seq, or if its equivalent exists in seq.
function exists(n, seq):
if n in seq:
return True
if not n.hasChildren:
return False
return exists(n.leftChild, seq) and exists(n.rightChild, seq)
获得所有等效数组只需要一些组合学。
#gets all possible equivalents for the given node. This includes itself.
#An equivalent is a list of nodes, so this method returns a list of lists of nodes.
function getPossibleEquivalents(node):
ret = new List()
baseCase = new List()
baseCase.append(node)
ret.append(baseCase)
if not node.hasChildren:
return ret
for each leftEquivalent in getPossibleEquivalents(node.leftChild):
for each rightEquivalent in getPossibleEquivalents(node.rightChild):
ret.append(leftEquivalent + rightEquivalent)
return ret
编辑:您可以通过嵌套 N 个 for 循环来扩展具有恰好 0 或 N 个子节点的树的 getPossibleEquivalents:
for each child0Equivalent in getPossibleEquivalents(node.child[0]):
for each child1Equivalent in getPossibleEquivalents(node.child[1]):
for each child2Equivalent in getPossibleEquivalents(node.child[2]):
for each child3Equivalent in getPossibleEquivalents(node.child[3]):
for each child4Equivalent in getPossibleEquivalents(node.child[4]):
ret.append(child0Equivalent + child1Equivalent + child2Equivalent + child3Equivalent + child4Equivalent + child5Equivalent)
如果您想编写一个可以处理具有任意数量的孩子的树的单个函数,您需要获取每个孩子的每个可能等价物的笛卡尔积。有些语言已经为您实现了笛卡尔积。例如,在 python 中:
from itertools import product
def getPossibleEquivalents(node):
ret = [node]
if len(node.children) == 0: return ret
for equivalentTuple in product(map(getPossibleEquivalents, node.children)):
possibleEquivalent = reduce(lambda x,y: x+y, equivalentTuple)
ret.append(possibleEquivalent)
return ret