Trie树(字典树)相关概念以及实现和练习

本文介绍了Trie树(字典树)的基本概念,包括其作为有序数据结构的优势,以及在单词自动补全、拼写检查和最长前缀匹配中的应用。文章详细讲解了如何实现Trie树的插入、搜索和startsWith操作,并通过分析题目648. 单词替换,展示了Trie树在解决实际问题中的作用。
摘要由CSDN通过智能技术生成

Trie树(字典树)相关概念以及实现和练习

Trie树基本概述

Trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存储字符串的数据结构,它的关键字不是保存在节点中,而是由节点在树中的位置决定
在这里插入图片描述
一个节点的所有子孙都具有相同的前缀,也就是这个节点对应的字符串,根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才具有相关的值。

trie树最大优点是利用字符串的公共前缀来减少存储空间和查询时间,从而最大限度地减少无谓的字符串比较,非常高效。

trie的应用:单词自动补全、拼写检查、最长前缀匹配等

Trie的结点结构:

struct TrieNode
{
   
     bool is_end; //表示是否是一个字符串的结尾
     TrieNode *child[26]; //a-z 26个字母
     TrieNode():is_end(false){
   
         for(int i=0;i<26;i++)
             child[i]='a'+i;
     }  	
};
208. 实现 Trie (前缀树)

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 true
trie.search("app");     // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");   
trie.search("app");     // 返回 true

分析:

Trie树的单词插入:

  • 构建ptr指针指向root
  • 逐个遍历字符串中的各个字符
    • 计算下标pos=正在遍历的字符-‘a’
    • 如果ptr指向的结点的第pos个孩子为假:
      • 创建该结点的第pos个孩子
    • ptr指向该结点的第pos个孩子
  • 标记ptr指向的结点的is_end为true

Trie树的搜索:

  • 使用ptr指针指向root
  • 逐个遍历字符串中的各个字符
    • 计算下标pos=正在遍历的字符-‘a’
    • 如果ptr指向的结点不存在,则返回false
    • 否则ptr指向该结点的第pos个孩子
  • 返回ptr指向的结点的is_end

Trie树搜索是否存在给定前缀:

  • 与搜索思路一致,遍历每个字符,直至遍历结束。期间,如果ptr指向的结点不存在则返回false。如果遍历该前缀结束,则说明至少该前缀属于一个单词,因为如果不属于任何单词的话是没办法遍历至最后一个字母的。
struct TrieNode
{
   
     bool is_end; //表示是否是一个字符串的结尾
     TrieNode *child[26];   //位置即字符,不需要另外存储
     TrieNode():is_end(false){
   
         for(int i=0;i<26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值