Я знаю, что название звучит немного странно, но, конечно, это просто аналогия с тем, что мне действительно нужно.Python 3.5 - «Инфекция открытых ветвей дерева»
Итак, предположим, у меня есть дерево, как это:
A
┃
┣━━ B
┃ ┣━━ D
┃ ┣━━ E
┃ ┃ ┗━━ H
┃ ┗━━ F
┃ ┗━━ I
┗━━ C
┗━━ G
с одним из листьев (или ветви), инфицированных какого-либо заболевания.
Обход дерева будет заражать все «открытые» ветви/листья во время обхода, , но не вновь открытые. Предположим, что ветвь E
заражена - заражение зараженного дерева F
и C
ветвей, так как они уже «открыты» на этой итерации, но не I
и G
.
код питона У меня до сих пор (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)
Какие выходы:
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
Как я могу сделать ветви 'более высокого уровня' (как C
) быть зараженным, без влияния на следующие итерации traverse_tree
?
(я надеюсь, что «открытые ветви» достаточно ясно, но только, чтобы удостовериться, что это - те ветви, которые выходы из цикла for child
уже, когда зараженный филиал обнаружен)