Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从特定节点获取树祖先的列表?_Python_Python 3.x_Tree_Ancestor - Fatal编程技术网

Python 如何从特定节点获取树祖先的列表?

Python 如何从特定节点获取树祖先的列表?,python,python-3.x,tree,ancestor,Python,Python 3.x,Tree,Ancestor,给定一棵树,其中每个节点可以有N个子节点,但只有一个父节点。如何获取一个节点的祖先?例如,假设我得到了这棵树: # Operator # ... FooOperator # ...... BOperator # ......... B1Operator # ............ B11Operator # ...... AOperator # ......... A2Operator # ......... A1Operator # ......... A3Operator # .....

给定一棵树,其中每个节点可以有N个子节点,但只有一个父节点。如何获取一个节点的祖先?例如,假设我得到了这棵树:

#  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”
获取祖先列表,例如结果是
[“Operator”、“FooOperator”、“COperator”、“C2Operator”、“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]:

如果您知道目标在哪里,您可能可以更智能地遍历树。

您尝试了什么,它到底有什么问题?使用这种数据结构,我认为这是不可能的。好吧,如果你从
树开始走每一条可能的路径,然后返回指向
的路径“C210Operator”
。但是,也许可以使用
parent
属性实现您自己的
节点
类,然后沿着父链?+1走到@juanpa。arrivillaga建议的自定义类实现更适合此问题的更好的数据结构。您的评论是对的,最好的方法是建立一个合适的数据结构,允许您线性地遍历父对象。总之,你解决了我想知道的问题;-)