Trie树——字典树,前缀树

Trie树又叫做前缀树,概念如图:

Trie树——字典树,前缀树_第1张图片

已知一个字典,将字典中每个单词,按照顺序插入到树中。

树中的每个节点保存:

  • 从root到该节点的路径: 前缀
  • 路径是否可以代表一个单词
  • 子节点

应用:搜索引擎,DFS剪枝

当需要一个一个字符暴力的遍历时,前缀树可以减少不必要的搜索。

实现:

最好不要用unordered_map去实现,因为leetcode的编译器不支持,需要自己定义key的哈希,和重构value的比较。最好用动态数组。

代表题目:

212. 单词搜索 II

在DFS搜索时候可以就地修改,可以省去visited数组的空间,搜索完成后恢复。

class TrieNode{
public:
    string word = "";
    vector nodes;
    TrieNode():nodes(26, 0){}
};


// class Trie{
//     Node root;
// public:
//     Trie(Node subtree){
//         root = subtree;
//     }

//     void insertNode(string word){
//         Node cur = root;
//         for(auto it: word){
//             cur.children.insert(make_pair(it, Node(it)));
//             if(it == word.end() - 1){
//                 cur.children.word = word;
//             }
//             cur = cur.children[it];
//         }
//     }

//     bool find(string word){
//         Node lastnode = SearchNode(word);
//         if(lastnode.hasword) return true;
//         else return false;
//     }

//     // 也可以用来检测prefix,如果该节点存在那么prefix就存在
//     Node SearchNode(string word){
//         Node cur = root;
//         auto it = word.begin();
//         while(it != word.end() - 1){
//             if(cur.children.count(it) == 0) return nullptr;
//             cur = cur.children[it];
//             it ++;
//         }
//         return cur;
//     }
// };

class Solution {
public:
    int rows, cols;
    vector res;

    void dfs(vector>& board, TrieNode* root, int x, int y){
        char c = board[x][y];
        //递归边界
        if(c=='.' || root->nodes[c-'a']==0) return;
        root = root->nodes[c-'a'];
        if(root->word!=""){
            res.push_back(root->word);
            root->word = "";
        }
        
        // 标记访问过的位置
        board[x][y] = '.';
        if(x>0) dfs(board, root, x-1, y);
        if(y>0) dfs(board, root, x, y-1);
        if(x+1 findWords(vector>& board, vector& words) {

        rows = board.size();
        cols = rows ? board[0].size():0;
        if(rows==0 || cols==0) return res;
        
        // build前缀树
        TrieNode* root = new TrieNode();
        for(string word:words){
            TrieNode *cur = root;
            for(int i=0; inodes[idx]==0) cur->nodes[idx] = new TrieNode();
                cur = cur->nodes[idx];
            }
            cur->word = word;
        }

        for(int i=0; i

 

 

 

你可能感兴趣的:(Trie树——字典树,前缀树)