【问题标题】:How to print Trie in tree structure in python?如何在 python 中以树结构打印 Trie?
【发布时间】:2021-08-18 11:57:59
【问题描述】:

我仍然是编程的初学者。我不知道如何在树结构中打印 trie,因为我尝试了几种方法。任何人都可以帮忙吗? ????

class TrieNode:
 
    def __init__(self, data):
 
        self.data = data
        self.is_end = False
        self.children = {}
 
class Trie(object):
 
    def __init__(self):
        self.root = TrieNode("")

    def insert(self, array):
        node = self.root
 
        for x in array:
            if x in node.children:
                node = node.children[x]
                print(node.data)
            else:
                new_node = TrieNode(x)
                node.children[x] = new_node
                node = new_node
                print(node.data)
        node.is_end = True

下面是主类的代码:-

tr = Trie()
n = int(input("Enter number of file(s): "))
for x in range (n):
    path = input("Enter your directory path: ")
    tr.insert(path.split("/"))
print(tr.root.data)

【问题讨论】:

    标签: python printing tree display trie


    【解决方案1】:

    您可以在 Trie 类上定义一个 __repr__ 方法,这样当您执行 print(tr) 时,该方法将被调用,并且您会以您想要的方式打印树。

    以下是这种__repr__ 方法的可能实现:它使用递归函数和indent 变量来确保项目缩进:

        def __repr__(self):
            def recur(node, indent):
                return "".join(indent + key + ("$" if child.is_end else "") 
                                      + recur(child, indent + "  ") 
                    for key, child in node.children.items())
    
            return recur(self.root, "\n")
    

    当对应的is_end 属性为True 时,此字符串表示将在每个数据后附加一个$

    关于你的 trie 实现的评论:

    您当前存储了两次数据:一次作为data 属性,第二次作为children 字典中的键。这不应该是必要的。在您使用node.data 的两个地方,您可以改用x -- 它们具有相同的值。

    然后,您可以从 TrieNode 类中删除 data 属性。代码将如下所示:

    class TrieNode:
        def __init__(self):
            self.is_end = False
            self.children = {}
    
    
    class Trie(object):
        def __init__(self):
            self.root = TrieNode()
    
        def insert(self, array):
            node = self.root
     
            for x in array:
                if x in node.children:
                    node = node.children[x]
                else:
                    child = TrieNode()
                    node.children[x] = child
                    node = child
                print(x)
            node.is_end = True
    
        def __repr__(self):
            def recur(node, indent):
                return "".join(indent + key + ("$" if child.is_end else "") 
                                      + recur(child, indent + "  ") 
                    for key, child in node.children.items())
    
            return recur(self.root, "\n")
    
    
    # Main code
    tr = Trie()
    n = int(input("Enter number of file(s): "))
    for x in range (n):
        path = input("Enter your directory path: ")
        tr.insert(path.split("/"))
    print(tr)
    

    【讨论】:

    • 您能对此答案提供一些反馈吗?
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2018-07-28
    • 2012-07-27
    • 1970-01-01
    • 2022-11-25
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多