栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

实现Trie树(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实现Trie树(C++)

文章目录
  • 前言
  • 一、Trie树原理
  • 二、Trie树实现(C++)
    • 1.接口
    • 2.实现
  • 总结


前言

Trie树,又叫前缀树,字典树,单词查找树,是由二叉树衍生出来的一种树形高级数据结构。经常用于处理字符串前缀相关的操作。本文浅析Trie树原理并给出C++代码实现。


一、Trie树原理

Trie树本质上就是一棵从二叉树衍生出来的多叉树,字符串共享前缀,相同前缀的字符串集中在Trie中的一个子树上。减少重复存储,使用较少的空间,且能够实现快速查找字符串。
Trie树节点:

Trie树实例: 白色表示val为空

二、Trie树实现(C++) 1.接口

实现几个必要的接口:
1.插入单词
2.查找单词是否存在
3.查找前缀是否存在

2.实现

先定义Trie节点:

struct Node{
    bool is_end;
    Node* son[26];
    Node() {
        is_end = false;
        for (int i = 0; i < 26; i++) son[i] = NULL;
    }
};

Trie实现代码如下:

class Trie {
public:
    Node* root = new Node(); //根节点
    Trie() {
    }
    
    void insert(string word) {  //插入单词
        auto p = root;
        for (auto c : word) {
            int u = c - 'a';
            if (!p->son[u]) p->son[u] = new Node(); //如果不存在则创建节点
            p = p->son[u]; 
        }
        p->is_end = true;
    }
    
    bool search(string word) { //搜索单词
        auto p = root;
        for (auto c : word) {
            int u = c - 'a';
            if (!p->son[u]) return false; //不存在
            p = p->son[u];
        }
        return p->is_end; 
    }
    
    bool startsWith(string prefix) { //查找前缀
        auto p = root;
        for (auto c : prefix) {
            int u = c - 'a';
            if (!p->son[u]) return false;
            p = p->son[u];
        }
        return true;
    }
};

总结

利用了数组+二叉树结构存储键值映射,本质为哈希操作,数组索引表示某个字符。

LeetCode 208.实现Trie(前缀树)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/833103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号