• 《征服数据结构》字典树(Trie树)


    摘要:

    1,字典树的介绍

    2,字典树的插入

    3,字典树的查询

    4,字典树排序

    5,字典树的删除

    6,字典树的用途

    1,字典树的介绍

    字典树又称 Trie 树 ,单词查找树,前缀树,也是一种树状结构,就是在查询目标时,像字典一样按照一定顺序和步骤访问树的节点,它主要利用字符串的公共前缀来减少查询次数,最大限度地减少字符串比较。

    比如要查找一个字符串是否存在,或者是否存在 xxx 开头的字符串。假设字符串只包含小写字母,那么我们可以把字典树看作是一棵每个节点最多有 26 个子节点的树。

    字典树中根节点是不存储数据的,除了根节点以外,每个节点代表一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

    比如有 wang, yi ,bo , yibo 等字符串,只需要把它添加到字典树中,然后在每个字符串末尾标记为一个完整的字符串即可,如图下图所示。

    31948e943eb76b9261a8be9a70f5d60b.png

    比如查找字符串 wan ,因为字符串的最后一个字符 n 在字典树中没有标记,所以 wan 不是一个完整的字符串。又比如查找字符串 yi ,因为字符串的最后一个字符 i 在字典树中标记了,所以 yi 是一个完整的字符串。

    字典树中每个节点需要两个变量,一个是记录子节点的数组,一个是标记从根节点到当前节点是否是一个完整的字符串。

    Java 代码:

    1. // 节点类。
    2. class TrieNode {
    3.     boolean isEnd;  // 标记是否为完整字符串。
    4.     TrieNode[] children; // 子节点数组。
    5.     public TrieNode() {
    6.         isEnd = false;// 默认不是完整字符串。
    7.         // 默认每个节点最多有26个子节点,还可以使用map。
    8.         children = new TrieNode[26];
    9.     }
    10. }

    C++ 代码:

    1. // 节点类。
    2. class TrieNode {
    3. public:
    4.     bool isEnd = false;  // 标记是否为完整字符串。
    5.     TrieNode *children[26];// 子节点数组。
    6. };

    这里我们规定只查询小写字母,如果包含其他字母的话可以使用 Map 。

    1. Map map = new HashMap<>();// java
    2. unordered_map<char, TrieNode> mp;// c++

    字典树的 3 个基本性质:

    1,根节点不包含字符,除根节点外每一个节点都只包含一个字符。

    2,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

    3,每个节点的所有子节点包含的字符都不相同。

    2,字典树的插入

    先来看一下字典树的插入,实际上也是字典树的创建,它的步骤如下:

    1,从根节点开始,依次读取字符串中的每个字符。

  • 相关阅读:
    PostgreSQL更改用户登录密码认证协议
    前端设计模式
    JVM的几种常见垃圾回收算法
    在Spring Boot API Gateway中实现Sticky Session
    GFP-GAN学习笔记
    基于Java的飞机雷电射击游戏的设计实现(Eclipse开发)
    windows-系统安装-前奏
    Tomca架构细节
    【数学建模】2023华为杯研究生数学建模F题思路详解
    LeetCode 0290. 单词规律
  • 原文地址:https://blog.csdn.net/abcdef314159/article/details/140030487