字典树-Trie


目录

Trie树基本概念

力扣208:实现前缀树

实现代码

测试结果:



Trie树基本概念

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。它的核心思想就是通过最大限度地减少无谓的字符串比较,使得查询高效率,即「用空间换时间」,再利用共同前缀来提高查询效率。

字典树-Trie_第1张图片

 

实际存储结构如图

 字典树-Trie_第2张图片

力扣208:实现前缀树

字典树-Trie_第3张图片

实现代码

//Trie的节点:val child isEndOfChild
class TrieNode{
    public:
    char val;
    bool isEndOfWord;
    TrieNode*child[26];
    TrieNode()
    {
        isEndOfWord = false;
        for(int i = 0;i<26;i++)
            child[i] = nullptr;
        val = '/';
    }
    TrieNode(char c)
    {
        isEndOfWord = false;
        for(int i = 0;i<26;i++)
            child[i] = nullptr;
        val = c;
    }
};
class Trie {
private:
    TrieNode* root;
public:
    /** Initialize your data structure here. */
    Trie() { 
        root = new TrieNode();
    }
    /** Inserts a word into the trie. */
    void insert(string word) {
        if(word == "")return;
        
        int len = word.size();
        TrieNode*p = root;
        for(int i = 0;ichild)[word[i]-'a'] == nullptr)
            {
                (p->child)[word[i]-'a'] = new TrieNode(word[i]);
                p =  (p->child)[word[i]-'a'];
            }
            else
                p = (p->child)[word[i]-'a'];
        }
        p->isEndOfWord = true;
        
    }
    /** Returns if the word is in the trie. */
    bool search(string word) {
        if(word == ""||root == nullptr)
            return false;
        TrieNode*p = root;
        for(int i = 0;ichild)[word[i]-'a']!=nullptr)
                p = (p->child)[word[i]-'a'];
            else
                return false;
        }
        return p->isEndOfWord == true?true:false;
        
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        if(prefix == ""||root == nullptr)
            return false;
        TrieNode*p = root;
        for(int i = 0;ichild)[prefix[i]-'a'] != nullptr)
                p = (p->child)[prefix[i] - 'a'];
            else
                return false;
        }
        return true;
    }
};

测试结果:

字典树-Trie_第4张图片

 

 

你可能感兴趣的:(leetcode树)