如何从特定节点获取树祖先列表?
How can I get a list of tree-ancestors from a particular node?
给定一棵树,其中每个节点可以有 N 个子节点,但只有 1 个父节点。我怎样才能得到一个节点的祖先?例如,假设我有这棵树:
# 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)
如果结果是 ["Operator", "FooOperator", "COperator", "C2Operator", "C21Operator"]
,您如何从 "C21Operator"
获得祖先列表?
鉴于您的数据结构,我认为只能采用蛮力解决方案:
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]:
如果您知道目标在哪里,您也许可以更智能地遍历树。
给定一棵树,其中每个节点可以有 N 个子节点,但只有 1 个父节点。我怎样才能得到一个节点的祖先?例如,假设我有这棵树:
# 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)
如果结果是 ["Operator", "FooOperator", "COperator", "C2Operator", "C21Operator"]
,您如何从 "C21Operator"
获得祖先列表?
鉴于您的数据结构,我认为只能采用蛮力解决方案:
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]:
如果您知道目标在哪里,您也许可以更智能地遍历树。