当前位置: 面试刷题>> 实现前缀树(Trie) (经典算法题500道)


### 题目描述补充 题目:实现一个前缀树(Trie,又称字典树、单词查找树或键树),用于高效存储和检索字符串数据集中的键。前缀树是一种树形数据结构,其中的每个节点代表字符串中的一个字符。树的根节点不包含字符,除根节点外的每个节点都包含一个字符。从根节点到某个节点的路径上的字符连接起来,就是该节点对应的字符串。前缀树支持以下几种基本操作: 1. **插入**:向前缀树中插入一个新的字符串。 2. **搜索**:在前缀树中搜索一个完整的字符串。 3. **前缀搜索**:在前缀树中搜索一个字符串的前缀,返回所有以该前缀开头的字符串。 ### 示例代码 以下是使用 PHP、Python 和 JavaScript 实现的前缀树的基本框架和示例代码。 #### PHP 示例 ```php class TrieNode { public $children = []; public $isEndOfWord = false; public function __construct() { $this->children = []; $this->isEndOfWord = false; } } class Trie { private $root; public function __construct() { $this->root = new TrieNode(); } // 插入字符串 public function insert($word) { $node = $this->root; for ($i = 0; $i < strlen($word); $i++) { $char = $word[$i]; if (!isset($node->children[$char])) { $node->children[$char] = new TrieNode(); } $node = $node->children[$char]; } $node->isEndOfWord = true; } // 搜索字符串 public function search($word) { $node = $this->root; for ($i = 0; $i < strlen($word); $i++) { $char = $word[$i]; if (!isset($node->children[$char])) { return false; } $node = $node->children[$char]; } return $node->isEndOfWord; } // 前缀搜索 public function startsWith($prefix) { $node = $this->root; for ($i = 0; $i < strlen($prefix); $i++) { $char = $prefix[$i]; if (!isset($node->children[$char])) { return false; } $node = $node->children[$char]; } return true; } } // 使用示例 $trie = new Trie(); $trie->insert("apple"); echo $trie->search("apple") ? "Found" : "Not found"; // 输出 "Found" echo $trie->startsWith("app") ? "Starts with 'app'" : "Not starts with 'app'"; // 输出 "Starts with 'app'" ``` #### Python 示例 ```python class TrieNode: def __init__(self): self.children = {} self.is_end_of_word = False class Trie: def __init__(self): self.root = TrieNode() def insert(self, word: str) -> None: node = self.root for char in word: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.is_end_of_word = True def search(self, word: str) -> bool: node = self.root for char in word: if char not in node.children: return False node = node.children[char] return node.is_end_of_word def startsWith(self, prefix: str) -> bool: node = self.root for char in prefix: if char not in node.children: return False node = node.children[char] return True # 使用示例 trie = Trie() trie.insert("apple") print(trie.search("apple")) # 输出 True print(trie.startsWith("app")) # 输出 True ``` #### JavaScript 示例 ```javascript class TrieNode { constructor() { this.children = {}; this.isEndOfWord = false; } } class Trie { constructor() { this.root = new TrieNode(); } insert(word) { let node = this.root; for (let char of word) { if (!node.children[char]) { node.children[char] = new TrieNode(); } node = node.children[char]; } node.isEndOfWord = true; } search(word) { let node = this.root; for (let char of word) { if (!node.children[char]) { return false; } node = node.children[char]; } return node.isEndOfWord; } startsWith(prefix) { let node = this.root; for (let char of prefix) { if (!node.children[char]) { return false; } node = node.children[char]; } return true; } } // 使用示例 const trie = new Trie(); trie.insert("apple"); console.log(trie.search("apple")); // 输出 true console.log(trie.startsWith("app")); // 输出 true ``` ### 码小课 码小课网站中有更多关于算法和数据结构的内容分享,包括前缀树(Trie)的深入解析和进阶应用,欢迎大家学习交流。
推荐面试题