[英]How to print Trie in tree structure in python?
我仍然是编程的初学者。 我不知道如何在树结构中打印 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
以下是主要 class 的代码:-
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)
您可以在Trie
class 上定义一个__repr__
方法,这样当您执行print(tr)
时,该方法将被调用,并且您将以所需的方式打印树。
这是这种__repr__
方法的可能实现:它使用递归 function 和一个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")
这个字符串表示将 append 每条数据后一个$
当对应的is_end
属性为 True 时。
您当前存储数据两次:一次作为data
属性,第二次作为children
字典中的键。 这不应该是必要的。 在您使用node.data
的两个地方,您可以使用x
代替——它们具有相同的值。
然后,您可以从TrieNode
class 中删除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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.