问题描述
class Trie:
def __insert(node,item):
# This is the recursive insert function.
if len(item) == 0:
return None
elif node == None:
newnode = Trie.TrieNode(item[0])
newnode.follows = Trie.__insert(newnode.follows,item[1:])
return newnode
# return Trie.TrieNode(item[0],follows=Trie.__insert(node,item[1:]))
elif node.item == item[0]:
node.follows = Trie.__insert(node.follows,item[1:])
else:
node.next = Trie.__insert(node.next,item)
def __contains(node,item):
# This is the recursive membership test.
if len(item) == 0:
return True
elif node == None:
return False
elif node.item == item[0]:
return Trie.__contains(node.follows,item[1:])
else:
return Trie.__contains(node.next,item)
class TrieNode:
def __init__(self,item,next=None,follows=None):
self.item = item
self.next = next
self.follows = follows
def __str__(self):
return "TrieNode(" + str(self.item) + ")"
def __init__(self):
self.start = None
def insert(self,item):
sentinel = item + "$"
self.start = Trie.__insert(self.start,sentinel)
def __contains__(self,item):
sentinel = item + "$"
return Trie.__contains(self.start,sentinel)
def main():
t = Trie()
t.insert("cow")
t.insert("cat")
# t.insert("rat")
# t.insert("rabbit")
# t.insert("dog")
print("cow" in t)
if __name__ == "__main__":
main()
代码规则如下:
对于 __insert 函数:
- 如果键为空(即键中没有任何单位),则返回
None
作为空节点。 - 如果节点是
None
,则使用密钥的下一个单元创建一个新节点,并将密钥的其余部分插入并添加到follows
链接中。 - 如果键的第一个单元与当前节点的单元匹配,则键的其余部分被插入到节点的
follows
链接中。 - 否则,密钥将插入到节点的
next
链接中。
对于 __contains 函数:
- 如果键的长度为 0,则返回
True
报告成功。 - 如果我们正在查看的节点是
None
,则通过返回False
报告失败。 - 如果键的第一个单元与当前节点中的单元匹配,则检查从
follows
节点开始的其余键的成员资格。 - 否则,检查以特里树中
next
节点开头的键的成员资格。
插入一项是可以的;例如,如果其中只有 True
,它在检查 cat
时会给出 cat
。
不过,这是一个不同的故事,有多个字符串。 main 函数给出了 False
,而不是它应该给出的 True
。我想知道这是否与 __insert
或 __contains
函数有关。有什么办法可以解决吗?
解决方法
当 __insert
不为空时,您的 item
方法应该总是返回一个节点。然而,在 node
不是 None 的情况下,它返回 None。但在这种情况下应该返回 node
。
因此在此方法的末尾添加 return node
。