高级数据结构的学习与实现之 Trie树,字典树

第一次自学一种新的数据结构,感觉学会利用资源很重要,参考别人写的博客,谷歌搜索一下关于这中数据结构的一些问题,解决等,学会搜索资料,学习并掌握一门数据结构并不是很难。要知道相关的基本知识,主要应用与哪一方面,还有它的具体实现是如何的。在编码的时候还是会遇到各种问题,需要认真解决。总体来说学习得还是比较成功得,也掌握了它的使用。一、分析题目要求(一)程序设计的任务:
摘要由CSDN通过智能技术生成

第一次自学一种新的数据结构,感觉学会利用资源很重要,参考别人写的博客,谷歌搜索一下关于这中数据结构的一些问题,解决等,学会搜索资料,学习并掌握一门数据结构并不是很难。

要知道相关的基本知识,主要应用与哪一方面,还有它的具体实现是如何的。

在编码的时候还是会遇到各种问题,需要认真解决。总体来说学习得还是比较成功得,也掌握了它的使用。


一、分析题目要求

(一)程序设计的任务:

学习一种课外的数据结构,并实现它。包括:1)初始化2)插入元素3)删除元素4)查找元素5)相关应用

本程序实现了以上5个要求,实验报告是根据Trie树的学习与实现过程而写的。

(二)函数规定

·Trie CreateTrieNode()

1) 创建Tire树 

参数       :无     

返回值     :Trie 已初始化的TrieNode节点指针

2) 输入的形式 :无

输入值的范围:无

3) 输出的形式 :无

4) 所能达到的功能:

用于创建Trie节点,初始化count0existfalse,子节点为NULL 

 

·void InsertTrieNode(Trie root , char *word)

1) 插入单词元素

参数       :Trie 指定节点

word 指定单词字符串   

返回值     :无

2) 输入的形式 :字符串类型

输入值的范围:字符串范围

3) 输出的形式 :无

4) 所能达到的功能:

用于向指定节点插入指定字符串节点

 

·bool SearchString(Trie root , char* word)

1) 查找字符串 

参数       :Trie 指定节点

word 指定单词字符串     

返回值     :bool 是否存在指定字符串

2) 输入的形式 :字符串类型

输入值的范围:字符串范围

3) 输出的形式 :无

4) 所能达到的功能:

用于在指定根节点中查找字符串是否存在

 

·int SearchTrieNode(Trie root , char* word)

1) 查找单词前缀出现的次数 

参数       :Trie 指定节点

word 指定单词字符串     

返回值     :int 单词前缀出现的次数

2) 输入的形式 :字符串类型

输入值的范围:字符串范围

3) 输出的形式 :无

4) 所能达到的功能:

用于在指定根节点中查找单词前缀次数,类似SearchString

 

·bool DelectString(Trie root , char* word)

1) 删除指定单词 

参数       :Trie 指定节点

word 指定单词字符串  

返回值     :bool 删除成功与否

2) 输入的形式 :字符串类型

输入值的范围:字符串范围

3) 输出的形式 :无

4) 所能达到的功能:

用于在指定根节点中删除指定单词

 

·void DelectTrie(Trie root)

1) 删除整棵树

参数       :Trie 指定字典树

返回值     :无

2) 输入的形式 :Trie结构指针

输入值的范围:无

3) 输出的形式 :无

4) 所能达到的功能:

因为现实中删除某个元素的情况较少见,而删除整棵树较为常见,

        因此提供删除整棵树的方法,用于释放整个字典树占的堆空间

 

·void TraverTrie(Trie root)

1) 遍历整个字典树

参数       :Trie 指定字典树

返回值     :无

2) 输入的形式 :Trie结构指针

输入值的范围:无

3) 输出的形式 :字符串类型

4) 所能达到的功能:

输出字典树中的每一个单词

 

·void introdution()

1) 遍历整个字典树

参数       :无

返回值     :无

2) 输入的形式 :无

输入值的范围:无

3) 输出的形式 :字符串类型

4) 所能达到的功能:

这是一个输出顶部介绍的函数,因为不想在这里打太多代码,

所以使用了宏定义,具体代码包含在head.h的头文件中。

 

·void memu()

1) 输出菜单的函数

参数       :无

返回值     :无

2) 输入的形式 :无

输入值的范围:无

3) 输出的形式 :字符串类型

4) 所能达到的功能:

使用了宏定义,包含在head.h

 

·void working()

1) 主要工作的函数

参数       :无

返回值     :无

2) 输入的形式 :int整型,char字符类型,string字符串类型

输入值的范围:int 2147483647~-2147483648char -128~127

3) 输出的形式 :字符串类型

4) 所能达到的功能:

主函数的运行主要在此,但在主函数里面调用此函数即可,

        用于完成增删查改

 

·int main()

1) 主函数

参数       :无

返回值     :int 

2) 输入的形式 :无

输入值的范围:无

3) 输出的形式 :字符串类型

4) 所能达到的功能:

程序的入口,分别调用其他函数以实现其功能

 

二、解题思路

Trie树的数据结构:

typedef struct TrieNode

{

    int count;                  //用来统计单词前缀出现的次数

    struct TrieNode* next[26];  //指向各个子树的指针

    bool exist;                 //标记该节点处是否构成单词

    char trans[11];             //当前节点对应的单词

 

}TrieNode ,*Trie;

 

1)初始化:

在内存申请一块Trie树的指针空间,把初始值设为0

2)插入元素:

对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走, 直到单词遍历完,将最后的节点的exist标记为true,表示该单词已插入Trie树。

 while(字符串未结束)

    {

        if(当前位置为空)

        {

            位当前元素申请空间;

        }

        指针指向当前元素;

        为当前元素赋值

        字符串向下移

}

3)删除元素:

对于一个单词,判断是否存在字典树中,不存在即返回;

存在分是否为字符串的前缀,以递归的形式进行删除

1不是

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值