【问题标题】:How do I build a tree from a list of symbols?如何从符号列表构建树?
【发布时间】:2021-02-24 07:15:55
【问题描述】:

我是 python 新手。

我有一个树形数据结构是这样定义的(不是我写的,是提供的):

class Tree(object):
    def __init__(self, name='root', children=None):
        self.name = name
        self.children = []
        if children is not None:
            for child in children:
                self.add_child(child)
    def __repr__(self):
        return self.name
    def add_child(self, node):
        assert isinstance(node, Tree)
        self.children.append(node)

以下函数显示树:

def display_tree(root, indent=0):
    print(' ' * indent, root)
    if len(root.children) > 0:
        for child in root.children:
            display_tree(child, indent+4)

现在,我有一个符号列表,如下所示:

symbols = ['a', '[', 'b', '[', 'c', 'd', 'e', ']', 'f', '[', 'g', 'h', '[', 'i', ']', '1j', '[', 'k', 'l', ']', ']', 'm', ']']

我需要能够得到如下的树:

 a
     b
         c
         d
         e
     f
         g
         h
             i
         j
             k
             l
     m   

我发现以下代码行给了我需要的结果:

t = Tree('a',[Tree('b',[Tree('c'),
                        Tree('d'),
                        Tree('e')]),
              Tree('f',[Tree('g'),
                        Tree('h',[Tree('i')]),
                        Tree('j',[Tree('k'),
                                   Tree('l')])]),
              Tree('m')])
    
    display_tree(t)

那么如何将符号列表转换为上面't'的形式,这样当我将列表作为函数的输入时,我得到树作为输出?

我最初的想法是使用堆栈数据结构,并不断将符号压入堆栈,直到遇到']',然后通过从堆栈中弹出元素来构建一棵树。但这并没有保留顺序,而且我对python的熟练程度也不足以实现这一点。

【问题讨论】:

    标签: python python-3.x list tree


    【解决方案1】:

    您可以使用递归堆栈。这是一个从这些符号构建树的递归函数:

    def tree_from_symbols(symbols):
        it = iter(symbols)
        
        def recur(delimiter=None):
            nodes = []
            while True:
                symbol = next(it, None)
                if symbol == delimiter:
                    return nodes
                if symbol == "[":
                    for child in recur("]"):
                        nodes[-1].add_child(child)
                else:
                    nodes.append(Tree(symbol))
        roots = recur()
        if len(roots) > 1:
            raise ValueError("The root is not unique")
        if len(roots) == 1:
            return roots[0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多