2017-02-27 9 views
0

각 노드가 N 개의 자식을 가질 수 있지만 하나의 부모 만 가질 수있는 트리가 주어집니다. 한 노드의 조상을 얻으려면 어떻게해야합니까? 이러한 결과였다 ["Operator", "FooOperator", "COperator", "C2Operator", "C21Operator"]특정 노드에서 트리 선조 목록을 얻으려면 어떻게해야합니까?

# Operator 
# ... FooOperator 
# ...... BOperator 
# ......... B1Operator 
# ............ B11Operator 
# ...... AOperator 
# ......... A2Operator 
# ......... A1Operator 
# ......... A3Operator 
# ...... COperator 
# ......... C1Operator 
# ......... C2Operator 
# ............ C21Operator 

tree = { 
    'children': [{ 
     'children': [{ 
      'children': [{ 
       'children': [{ 
        'children': [], 
        'class': 'B11Operator', 
        'parent': 'B1Operator' 
       }], 
       'class': 'B1Operator', 
       'parent': 'BOperator' 
      }], 
      'class': 'BOperator', 
      'parent': 'FooOperator' 
     },{ 
     'children': [{ 
      'children': [], 
      'class': 'A2Operator', 
      'parent': 'AOperator' 
     },{ 
      'children': [], 
      'class': 'A1Operator', 
      'parent': 'AOperator' 
     },{ 
      'children': [], 
      'class': 'A3Operator', 
      'parent': 'AOperator' 
     }], 
     'class': 'AOperator', 
     'parent': 'FooOperator'},{ 
     'children': [{ 
      'children': [], 
      'class': 'C1Operator', 
      'parent': 'COperator' 
     },{ 
      'children': [{ 
       'children': [], 
       'class': 'C21Operator', 
       'parent': 'C2Operator' 
      }], 
      'class': 'C2Operator', 
      'parent': 'COperator' 
     }], 
     'class': 'COperator', 
     'parent': 'FooOperator' 
    }], 
    'class': 'FooOperator', 
    'parent': 'Operator' 
    }], 
    'class': 'Operator', 
    'parent': None 
} 

def display_tree(node, indent=0): 
    print('.' * indent, node['class']) 
    indent += 3 
    for child in node['children']: 
     display_tree(child, indent) 

display_tree(tree) 

가 어떻게 "C21Operator"에서 조상 목록을 얻을 것입니다 : 예를 들어, 내가이 나무를 가지고 가정 해 봅시다? 데이터 구조를 감안할 때

+1

무엇을 시도 했습니까? 정확히 무엇이 문제입니까? – jonrsharpe

+1

이런 종류의 데이터 구조를 사용하면 실제로 가능할 것이라고 생각하지 않습니다. 글쎄, 아마도'tree'에서 시작할 때 가능한 모든 경로를 걸고''C210Operator ''로가는 길을 돌려 주면 될 것입니다. 하지만 어쩌면'parent' 속성을 사용하여 자신의'Node' 클래스를 구현 한 다음 부모 체인을 따라 가면됩니까? –

+0

+1에서 @ juanpa.arrivillaga가이 문제에 더 적합한 더 나은 데이터 구조를 구현하는 맞춤 클래스를 제안했습니다. –

답변

0

, 나는 단지 무차별 솔루션이 가능하다고 생각 : 당신은 어디에서 대상을 기대하는 알고있는 경우

In [6]: def path_to_child(tree, target, acc=None): 
    ...:  if acc is None: 
    ...:   acc = [] 
    ...:  if tree['class'] == target: 
    ...:   return acc 
    ...:  for child in tree['children']: 
    ...:   found = path_to_child(child, target, acc + [tree['class']]) 
    ...:   if found is not None: 
    ...:    return found 
    ...: 

In [7]: path_to_child(tree, 'C21Operator') 
Out[7]: ['Operator', 'FooOperator', 'COperator', 'C2Operator'] 

In [8]: 

당신은 아마 더 지능적으로 트리를 탐색 할 수 있습니다.

+0

귀하의 의견에 귀를 기울였습니다. 최선의 방법은 부모를 선형으로 통과 할 수있는 적합한 데이터 구조를 만드는 것입니다. 어쨌든, 당신은 내가 알고 싶었던 제안 된 문제를 해결했습니다 ;-) – BPL