【问题标题】:Cannot write a function to retrieve all words in a trie无法编写函数来检索 trie 中的所有单词
【发布时间】:2021-04-18 09:24:06
【问题描述】:

我有以下 Trie 实现:

class TrieNode:
    def __init__(self):
        self.nodes = defaultdict(TrieNode)
        self.is_fullpath = False


class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        curr = self.root
        for char in word:
            curr = curr.nodes[char]
        curr.is_fullpath = True

我正在尝试编写一个方法来检索我的 trie 中所有单词的列表。

t = Trie()
t.insert('a')
t.insert('ab')
print(t.paths())  # ---> ['a', 'ab']

我当前的实现如下所示:

def paths(self, node=None):
    if node is None:
        node = self.root
    result = []
    for k, v in node.nodes.items():
        if not node.is_fullpath:
            for el in self.paths(v):
                result.append(str(k) + el)
        else:
            result.append('')
    return result

但它似乎没有返回完整的单词列表。

【问题讨论】:

    标签: python data-structures trie


    【解决方案1】:

    以下是代码中的问题:

    • is_fullpath 为真时,它看起来不会更远。但在这种情况下,您应该更深入地查看(对于更长的单词)。

    • 它不应该检查node.is_fullpath,而是检查v.is_fullpath

    • result.append('') 不正确。应该是result.append(str(k))

    所以你的for 循环体可能如下所示:

    if v.is_fullpath:
        result.append(str(k))
    for el in self.paths(v):
        result.append(str(k) + el)
    

    但是我会这样做:

    在你的 TrieNode 类上定义这个递归生成器方法:

    def paths(self, prefix=""):
        if self.is_fullpath:
            yield prefix
        for chr, node in self.nodes.items():
            yield from node.paths(prefix + chr)
    

    注意这是如何将收集到的字符传递给递归调用的路径。如果在任何时候 is_fullpath 布尔值是 True,我们就会产生该路径。我们总是通过子节点递归地继续搜索。

    Trie 类的方法很简单:

    def paths(self):
        return list(self.root.paths())
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多