🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
Trie树,也称前缀树或字典树,是一种以字典序为基础的树形数据结构。它基本思想是将一组字符串按字符顺序存储在树形结构中,利用相同的前缀来合并重复节点,从而实现快速的字符串查找和搜索。
Trie树的根节点不存储任何字符,每个节点代表一个字符,每个节点包含一个指向子节点(即下一个字符)的指针数组和一个标识是否为单词结尾的标记。当插入或搜索一个字符串时,从根节点开始,依次遍历字符串的每个字符,如果存在该字符对应的子节点,继续向下遍历,否则新建一个子节点,并将指针指向该节点。当遍历完整个字符串后,标记最后一个节点为单词结尾。
Trie树的优点在于,它可以支持快速的字符串查找和前缀匹配,避免了字符串比较的开销,是一种非常高效的数据结构。
以下是C#实现Trie树常用操作的代码:
class TrieNode
{
public char Val { get; set; } // 节点字符
public bool IsEndOfWord { get; set; } // 是否为单词结尾
public TrieNode[] Children { get; set; } // 子节点数组
public TrieNode(char ch)
{
Val = ch;
IsEndOfWord = false;
Children = new TrieNode[26]; // 字母表大小为26
}
}
class Trie
{
private TrieNode root;
public Trie()
{
root = new TrieNode('#'); // 根节点不存储字符
}
// 插入一个单词
public void Insert(string word)
{
TrieNode node = root;
foreach (char ch in word)
{
int idx = ch - 'a';
if (node.Children[idx] == null)
node.Children[idx] = new TrieNode(ch); // 新建一个子节点
node = node.Children[idx]; // 继续向下遍历
}
node.IsEndOfWord = true; // 标记最后一个节点为单词结尾
}
// 查找一个单词
public bool Search(string word)
{
TrieNode node = root;
foreach (char ch in word)
{
int idx = ch - 'a';
if (node.Children[idx] == null)
return false; // 未找到该字符对应的子节点
node = node.Children[idx];
}
return node.IsEndOfWord; // 判断最后一个节点是否为单词结尾
}
// 查找Trie中是否有以给定前缀开头的单词
public bool StartsWith(string prefix)
{
TrieNode node = root;
foreach (char ch in prefix)
{
int idx = ch - 'a';
if (node.Children[idx] == null)
return false; // 未找到该字符对应的子节点
node = node.Children[idx];
}
return true; // 存在以该前缀开头的单词
}
}
以上代码实现了Trie树的插入、查找单词、查找前缀等常用操作。注意,在这个示例中,我们默认单词只包含小写字母。如果需要支持其他字符集,需要根据情况调整节点数组的大小。
Trie树(又称字典树或前缀树)是一种树形结构,用于存储关联数组,其中键通常是字符串。Trie树的优点和缺点如下:
优点:
缺点:
Trie树(又称前缀树或字典树)是一种树形数据结构,用于高效地搜索和插入字符串。Trie树常用于以下场景:
Trie树是一个非常有用的数据结构,适用于许多需要高效查找和存储字符串的场景。