返回 Trie 中的字符串

问题描述

我有这个 Trie:

                a
               / \
              b   c
             / \   \
            t   y   u
           2     5   3
numbers at leaf stands for frequency,stored at the terminal node

并且我有认的 Trie 搜索功能搜索字符串。当我执行 search('a') 时,它会返回 aby,因为它是最常插入的字符串。频率由 self.count 存储在我的函数中。 我不想发布我的代码

您将如何解决并将节点从 a 返回到 y? 提前致谢。

解决方法

您可以使用递归生成器函数遍历特里树并生成包含搜索值作为子字符串的所有字符串:

简单的尝试设置:

class Trie:
   def __init__(self,l=None):
      self.l,self.count,self.tree = l,[]
   def insert_l(self,word):
      if word:
         if not (n:=[i for i in self.tree if i.l == word[0]]):
            self.tree.append(Trie(word[0]))
            self.tree[-1].add_word(word)
         else:
            n[-1].add_word(word)
   def add_word(self,word):
      if self.l is not None:
         self.count += 1
      self.insert_l(word if self.l is None else word[1:])
      

现在,可以将 search 方法添加到 Trie

class Trie:
    ...
    def search(self,word):
      def _search(t,c = []):
         if not t.tree:
            yield c+[t]
         else:
            for i in t.tree:
              yield from _search(i,c if t.l is None else c+[t])
      if (l:=[(j,i) for i in _search(self) if word in (j:=''.join(k.l for k in i))]):
         return max(l,key=lambda x:x[-1][-1].count)[0]

t = Trie()
words = ['abt','abt','aby','acu','acu']
for word in words:
   t.add_word(word)

print(t.search('a'))

输出:

'aby'