📜  递归搜索一个特里(1)

📅  最后修改于: 2023-12-03 14:58:01.739000             🧑  作者: Mango

递归搜索一个特里

特里(Trie)是一种多叉树结构,主要用于字符串的存储和搜索。特里的每个节点代表一个字符,从根节点开始,到叶子节点的路径上的字符连接起来就组成了一个字符串。

在特里中搜索一个字符串,可以使用递归算法。具体实现方式如下:

代码实现
class TrieNode:
    def __init__(self):
        self.children = {}
        self.end_of_word = False

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

    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.end_of_word = True

    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.end_of_word

    def starts_with(self, prefix):
        node = self.root
        for char in prefix:
            if char not in node.children:
                return False
            node = node.children[char]
        return True

    def recursive_search(self, word):
        if not word:
            return self.root.end_of_word

        node = self.root
        for i, char in enumerate(word):
            if char not in node.children:
                return False
            node = node.children[char]
            if node.end_of_word:
                if self.recursive_search(word[i+1:]):
                    return True
        return False
代码说明
  • TrieNode类表示特里的节点,它有两个属性:childrenend_of_wordchildren是一个字典,存储着当前节点的子节点,end_of_word表示当前节点是否是一个单词的结尾。
  • Trie类表示特里,它有一个属性root,表示特里的根节点。它有三个方法:insertsearchstarts_with,分别用于插入一个单词、搜索一个单词和搜索以某个前缀开头的单词。
  • recursive_search方法是递归搜索算法的实现。它接受一个字符串参数word,表示待搜索的单词。如果word为空,则检查当前节点是否是一个单词的结尾,如果是,则返回True,否则返回False。否则,遍历word中的每个字符,如果当前字符不在当前节点的子节点中,则返回False。否则,移动到当前字符的子节点,如果当前节点是一个单词的结尾,则递归搜索剩余的字符,如果返回True,则表示找到了一个单词,直接返回True。如果遍历完word后没有找到一个单词的结尾,则返回False
示例
trie = Trie()
trie.insert("apple")
trie.insert("banana")
trie.insert("pear")
assert trie.recursive_search("apple") == True
assert trie.recursive_search("banana") == True
assert trie.recursive_search("pear") == True
assert trie.recursive_search("apples") == False
assert trie.recursive_search("ban") == False
assert trie.recursive_search("peach") == False