2015-03-31 2 views
1

Я пытаюсь создать дерево в python, и я хочу, чтобы он смог выполнить первый шаг по пересечению позже. Однако, когда я пытаюсь выполнить петлю через дочерние узлы (то есть корневой каталог), он, похоже, не находит детей. Однако, если я попытаюсь получить доступ к ребенку отдельно (root.children [1]), он действителен. Я уверен, что делаю что-то глупое, но я не знаю, где. Вот мой код:Добавление дочерних узлов к дереву в Python

class Component: 
    def __init__(self, compName, originName, connected = False): #removed to decrease code size 
    def __str__(self): 
     return "\n\tComponent Name: {0}\n\tOrigin Name: {1}\n\tConnected: {2}\n".format(self.name, self.origin, str(self.connected)); 

class Node: 
    def __init__(self, component, parent): 
     self.children = [];  
    def add_node(self, node):  
     self.children.append(node); 
     #...left out some broken code that is commented out...# 
    def __str__(self): 
     return "{0}".format(str(self.component)); 

class Tree: 
    def __init__(self): 
    def add_component(self, component, parent = None): 
     if self.root is None: 
      self.root = Node(component, parent); 
     else: 
      self.root.add_node(Node(component, parent)); 

def breadth_first(node): 
    result = []; 
    queue = []; 
    queue.append(node); 

    while queue: 
     node = queue.pop(0); 
     result.append(node); 
     plog("Adding to result\n"); 
     plog(str(node)); 

     if node in node.children: 
      for child in node.children: 
       if child not in result and child not in queue: 
        queue.append(child); 
     else: 
      plog("NO CHILDREN\n"); // this is being displayed 
    return result; 

def main(ScriptArgument, oDesktop): 
    component = Component("Laminate", "B7_TX"); 
    tree = Tree(); 
    tree.add_component(component); 

    component = Component("B7", "B7_TX"); 
    tree.add_component(component, "Laminate"); 

    result = breadth_first(tree.root); 
    for x in result: 
     plog(str(x) + "\n"); 

Это выход я получаю:

Adding to result   # output from breadth-first 

Component Name: Laminate #output from breadth-first 
Origin Name: B7_TX 
Connected: False 
NO CHILDREN    # this is indicating that the child was not added properly, I believe 

Component Name: Laminate # output from the loop in main 
Origin Name: B7_TX 
Connected: False 

ответ

1

Почему вы проверяете, находится ли родитель в списке детей со следующей строкой?

if node in node.children: 

Я бы просто сделать:

[...] 
while queue: 
    node = queue.pop(0); 
    result.append(node); 
    plog("Adding to result\n"); 
    plog(str(node)); 

    for child in node.children: 
     if child not in result and child not in queue: 
      queue.append(child); 
return result; 
0

Мой "если" чек был неправильно. Я проверял, находится ли корневой (или текущий) узел в списке собственных детей, что было неправильно. Я просто изменил это, чтобы проверить, есть ли какие-либо дети (если node.children :) и это сработало.

Смежные вопросы