如何在python中以树结构打印Trie? 关于您的特里实现的评论:

问题描述

我仍然是编程的初学者。我不知道如何在树结构中打印 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)

解决方法

您可以在您的 __repr__ 类上定义一个 Trie 方法,这样当您执行 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")

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

关于您的特里实现的评论:

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

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

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,"\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)