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