博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
查找算法系列(三):字典查找
阅读量:4211 次
发布时间:2019-05-26

本文共 2493 字,大约阅读时间需要 8 分钟。

我是小脆皮, 今天写一个字典树的博文~~~


字典树,就是n叉树。因为26个英文字母所以我这里就取26个叉了。

介绍完了。。。我也惊讶与我的辞藻这么不华丽。。。。
二叉树我们都知道, 不知道的狠狠的撞向豆腐~ 字典树不过就多了几个叉!

他的数据结构定义如下:

typedef struct node{    int nFlag;   //标记到此是否有单词    char* pStr;  //如果nFlag = 1, 此处则有单词释义    struct node *pList[26]; //26个指针, 代表 a~z }TrieTree;

添加单词“abz”,释义为“12345”;

1. 先来一个根节点(设为节点1), 找到 ‘a’ 指针, ‘a’ 指针指向节点2
2. 节点2的’b’指针指向节点3
3. 节点3的’z’指针,指向节点4
4. 能指向节点4说明有 abz这三个指针指向来的。即单词‘’abz‘’;
5. 节点4的标志位nFlag 置1,表示有单词, 释义pStr = “12345”,他的26个指针为NULL;
6. 如果,要添加单词”ab”, 那么就把节点3的 nFlag 置1,并添加 释义pStr ;

图片助攻:

这里写图片描述

跟着代码走2遍:

//结构体定义typedef struct node{    int nFlag;    char* pStr;    struct node *pList[26];}TrieTree;

1.创建树

/*传入的数据: char* str[] = {
"alibaba","aabb","lemon","windows","llleee"};char* str2[] = {
"ali","a2b2","lemmon","wind", "l2e3"};*/
TrieTree* CreateTrieTree(char* str[], char* str2[], int nLength){    int i;    if( !str || !str2 || nLength <=0)        return NULL;    //1. 先来一个根节点    TrieTree* pRoot = (TrieTree*)malloc(sizeof(TrieTree));    memset(pRoot, 0, sizeof(TrieTree));    //添加单词和释义    for(i=0; i

2.添加单词 重点在这里!!!这能理解就大功告成了!

void Add(TrieTree*pTree, char* str, char* str2){    TrieTree* pTemp = NULL;    for( int i=0 ;i
pList[str[i]-97] == NULL) { //添加新节点 pTemp = (TrieTree* )malloc(sizeof(TrieTree)); memset(pTemp, 0 , sizeof(TrieTree)); //这个字母的指针指向这个节点; pTree->pList[str[i] - 97] = pTemp; } pTree = pTree->pList[str[i] - 97]; } pTree->nFlag = 1; pTree->pStr = str2;}

3.单词的查找

单词查找和创建差不多, 就是找到单词后,判断一下nFlag 是不是1,是1就找到了!如果找单词的过程中, 碰到了空节点那么说明没有这个单词!

void FindWord(TrieTree* pTree, const char* str){    if(!pTree)         return ;    while(*str)    {        if(pTree->pList[*str - 97] == NULL)        {            printf("not find\n");            return ;        }        pTree = pTree->pList[*str - 97];        str++;    }    if(pTree->nFlag)    {        printf("find: %s\n",pTree->pStr);    }    else    {        printf("not find\n");    }    return ;}

4.显示

//字典树就是一个26叉树, 类似二叉树的前序遍历,先打印根,再遍历26个孩子;void ShowAll(TrieTree* pRoot){    if(pRoot == NULL) return ;    if(pRoot->nFlag == 1)        printf("%s  \n" ,pRoot->pStr);    for(int i=0;i<26;i++)    {        ShowAll(pRoot->pList[i]);    }}
int main(){    char *str[] = {
"alibaba","aabb","lemon","windows","llleee"}; char* str2[] = {
"ali","a2b2","lemmon","wind", "l2e3"}; TrieTree* pTree = CreateTrieTree(str, str2, 5); ShowAll(pTree); FindWord(pTree, "alibaba"); FindWord(pTree, "aliba");}
你可能感兴趣的文章
基于Netty实现CometStreaming方式的聊天室
查看>>
基于Netty打造HttpClient实现股票实时推送
查看>>
用CountDownLatch和AtomicReference解决cache失效大并发透传DB的思路
查看>>
wait-notify的另一种情况
查看>>
Netty的Nio写优化
查看>>
2013技术博客汇总贴
查看>>
Redis Object的Idle Time
查看>>
写给分布式神器Fourinone
查看>>
讨论一下淘宝的Fourinone
查看>>
写给高性能数据库引擎coolhash
查看>>
写给《数据库引擎 CoolHash 性能测试报告》
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>
Redis Cluster的FailOver失败案例分析
查看>>
Android Alarm驱动源代码分析(Alarm.c)
查看>>
Android震动vibrator(马达)--系统到驱动的流程
查看>>
针对高通平台的驱动开发CSDN博客
查看>>
LCD和键盘背光亮度---系统到驱动的流程和设置
查看>>
Android Camera架构浅析
查看>>
Android display架构分析
查看>>