Ich weiß, dass der Titel etwas komisch klingt, aber das ist natürlich nur eine Analogie zu dem, was ich wirklich brauche.Python 3.5 - 'Infect geöffnete Äste'
So lässt vermuten, ich habe einen Baum wie folgt aus:
A
┃
┣━━ B
┃ ┣━━ D
┃ ┣━━ E
┃ ┃ ┗━━ H
┃ ┗━━ F
┃ ┗━━ I
┗━━ C
┗━━ G
mit einem der Blätter (oder Zweige) mit einer Krankheit infiziert.
Beim Durchfahren des Baumes werden alle 'geöffneten' Zweige/Blätter zur Durchlaufzeit infiziert, , aber nicht neu geöffnete. Nehmen wir an, dass die Verzweigung E
infiziert ist - durchqueren der Baum Ausbeute infiziert F
und C
Zweige, da sie bereits in dieser Iteration "geöffnet", aber nicht I
und G
.
Der Code Python ich bisher habe, ist (infection_test.py
):
#!/usr/bin/env python
from itertools import chain
class Node():
def __init__(self, name, infected=False):
self.name = name
self.children = []
self.infected = infected
def __str__(self):
return 'Node ' + self.name + (' *** INFECTED ***' if self.infected else '')
A = Node('A');B = Node('B');C = Node('C')
D = Node('D');E = Node('E', True);F = Node('F');
G = Node('G');H = Node('H');I = Node('I');
A.children = [B, C]
B.children = [D, E, F]
E.children = [H]
F.children = [I]
C.children = [G]
def traverse_tree(node, level=0):
print (' '*level, node)
level += 1
infected_found = False
for child in node.children:
if child.infected:
infected_found = True
traverse_tree(child, level)
child.infected = infected_found
print('First traversal:')
traverse_tree(A)
print('\nAfter Infection:')
traverse_tree(A)
Welche Ausgänge:
First traversal:
Node A
Node B
Node D
Node E *** INFECTED ***
Node H
Node F
Node I
Node C
Node G
After Infection:
Node A
Node B
Node D
Node E *** INFECTED ***
Node H
Node F *** INFECTED ***
Node I
Node C
Node G
Wie kann ich 'höhere Ebene' Zweige (wie C
) machen infiziert werden, ohne Einfluss auf die nächsten Iterationen von traverse_tree
?
(ich hoffe, dass ‚geöffnet Zweige‘ ist klar genug, aber nur, um sicherzustellen, es ist - das sind die Zweige, die bereits von der for child
Schleife ergibt, wenn die infizierte Zweig entdeckt)