我在Python中实现Trie数据结构时遇到了一些问题。
以下是我的代码,我的" addWord"功能无法正常工作。
具体来说,例如,如果我想添加单词" sam"进入Trie,我应该期望根节点链接到一个孩子" s",它链接到一个孩子" a",然后链接到" m",最后链接到结束标志" *"。但是,我在这里的功能导致这个单词中的所有字母都是root的子句,而且这个单词中的所有字母都是root的每个子节点的子节点,这些字母永远存在。这里的关键是在整个Trie中,所有节点都有数据" s"实际上是指同一个对象,对于所有三个字母和结束符号都是相同的。我真的无法弄清楚我的功能如何设法做到这一点"惊人的"事情。我对该功能的测试也发布在下面。谁能帮我看看有什么不对?
(似乎这一行:current = current.children[index]
有问题,但我不知道为什么)
# implementation of Trie data structure
# a trie, or digital tree, is a kind of search tree
# used to store characters
# each node stores a character instead of number
# implementing class of Trie nodes
class Node:
def __init__(self, data = "*", children = []):
self.data = data
# children list can be implemented instead
# with a binary search tree
# note that members of children list are nodes
self.children = children
def isWord(self):
for items in self.children:
if items.data == "*":
# if * is one of the children
return True
return False
def hasChild(self, data):
print("checking", self.data, "has child", data)
for index in range(len(self.children)):
if self.children[index].data == data:
return index
return -1
def addChild(self, data):
new_node = Node(data)
self.children.append(new_node)
# implementing class of Trie tree
class Trie(object):
def __init__(self, root = Node("*")):
self.root = root
def addWord(self, data):
current = self.root
while True:
print()
for items in self.root.children:
print(items.data)
print()
if len(data) == 0:
# entire word finish adding
# current node point to
# last character of the word
# append end sign to current node
current.children.append(Node("*"))
print("append end sign to", current.data)
return
if current.hasChild(data[0]) != -1:
print(current.data, "does have", data[0])
# next character in existing Trie
# check remainder of the word
index = current.hasChild(data[0])
data = data[1:]
print("word truncated to", data)
current = current.children[index]
print("current point to", current.data)
else:
print(current.data, "does not have", data[0])
# add next character to this node
current.addChild(data[0])
# check remainder of the word
data = data[1:]
print("word truncated to", data)
current = current.children[-1]
print("current point to last element", current.data)
# End of method