あなたの再帰的アプローチは次のようになります
FUNCTION exists(Node target, Node root):
Node[] children = root.getChildren()
IF children NOT null: //if there are children go on to visit each one
FOR child IN children:
IF exists(target,child):
RETURN true
ELSE: //the base case, when 'root' has no children check if it's the value
RETURN root.value == target
RETURN false //will only be reached from the first call to exists() if there hasn't been a match already
Python では、これは次のようになります。
def exists(target,root):
if isinstance(root,list):
for child in root:
if exists(target,child):
return True
else:
return target == root
return False
いくつかの例:
print exists(2,[[[2]]])
print exists(2,[[1,4,5,[2]]])
print exists(2,[0,0,0,[0,[1,1,1]]])
>>>
True
True
False
Pythonでの反復は次のようになります
def existsNR(value,root):
visitstack = [child for child in root]
while visitstack:
node = visitstack.pop()
if isinstance(node,list):
visitstack += node
else:
if node == value:
return True
return False
この背後にあるロジックは、「ルート」の最初の子のそれぞれを調べ、子を持つ子ごとに、子をスタックにプッシュし、それらの子 (子) の「親」を削除することです。これらの子をチェックし、同様の方法でそれらを追加します...子を持たないものに到達するまで、その時点で等しいかどうかをチェックします。