我有一个链接的 trie 返回 false 而不是 true代码中可以修复哪些错误?

问题描述

我有一个没有按预期执行的尝试。其代码如下:

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 函数

  1. 如果键为空(即键中没有任何单位),则返回 None 作为空节点。
  2. 如果节点是 None,则使用密钥的下一个单元创建一个新节点,并将密钥的其余部分插入并添加follows 链接中。
  3. 如果键的第一个单元与当前节点的单元匹配,则键的其余部分被插入到节点的 follows 链接中。
  4. 否则,密钥将插入到节点的 next 链接中。

对于 __contains 函数

  1. 如果键的长度为 0,则返回 True 报告成功。
  2. 如果我们正在查看的节点是 None,则通过返回 False 报告失败。
  3. 如果键的第一个单元与当前节点中的单元匹配,则检查从 follows 节点开始的其余键的成员资格。
  4. 否则,检查以特里树中 next 节点开头的键的成员资格。

插入一项是可以的;例如,如果其中只有 True,它在检查 cat 时会给出 cat

不过,这是一个不同的故事,有多个字符串。 main 函数给出了 False,而不是它应该给出的 True。我想知道这是否与 __insert__contains 函数有关。有什么办法可以解决吗?

解决方法

__insert 不为空时,您的 item 方法应该总是返回一个节点。然而,在 node 不是 None 的情况下,它返回 None。但在这种情况下应该返回 node

因此在此方法的末尾添加 return node