字典树trie_tree

闲着没事,把以前写的字典树搬过来,贴一下。

 

深搜遍历那块个人觉得没有写太好,因为其余都是用char *实现的,那部分却用了string.

 

char*的速度是比string快很多的,所以还有待改进。所有代码均属个人编写,没有经过专门

 

测试,所以暂时还不知道正确性,如果有问题,还请指正。

 

#include<iostream>

#include<string>

using namespace std;

 

struct trie_node

{

     trie_node()

     {

         is_word = false;

         for(int i = 0;i<26;i++)

         {

              node[i] = NULL;

         }

     }

     bool is_word ; // 根到该节点是否对应一个字符串

     trie_node *node[26];

};

 

class Trie

{

public:

       

     trie_node *root;  //根节点

 

     Trie(){root = NULL;}

     bool trie_search(const char *str) //查找

     {

         trie_node *temp = root;

         for(int i = 0;i<strlen(str);i++)

         {

              if(temp->node[str[i]-'a'] == NULL)

                   return false;

              temp = temp->node[str[i]-'a'];

         }

         return temp->is_word;

     };

 

     void trie_insert(const char *str)    //插入

     {

         if(root == NULL)

              root = new trie_node;

         trie_node *temp = root;

         for(int i = 0;i<strlen(str);i++)

         {

              int site = str[i] - 'a';

              if(temp->node[site] == NULL)

              {

                   temp->node[site] = new trie_node;

                   temp = temp->node[site];

              }

              else

                   temp = temp->node[site];

         }

         temp->is_word = true;

     };

 

    

     bool trie_del(const char *str)       //删除

 

     {

 

         trie_node *temp = root;

 

         for(int i = 0;i<strlen(str);i++)

 

         {

 

              if(temp->node[str[i]-'a'] == NULL)

 

                   return false;

 

              temp = temp->node[str[i]-'a'];

 

         }

 

         if(temp->is_word)

 

              temp->is_word  = false;

 

         else

 

              return false;

 

         return true;

 

     }

 

 

};

    

void print(trie_node *root,string str)

{

     for(int i = 0;i<26;i++)

     {

         if(root->node[i] != NULL)

         {

              trie_node *temp = root;

              root = root->node[i]; 

              str += i+'a';         

              if(root->is_word)

              {

                   cout<<str<<endl;

              }            

              print(root,str);

              str.erase(str.size()-1,1); //删除最后一个元素

              root = temp;

         }

     }

}

 

int main()

{

     char s[11];  

     int n;       

     string str2 ;

     printf("1.插入/n");

     printf("2.查找/n");

     printf("3.删除/n");

     printf("4.深度遍历/n");

     Trie x;

     while(scanf("%d",&n)!=EOF)

     {

        

         switch(n)

         {

         case 1:

              scanf("%s",&s);

              x.trie_insert(s);

              printf("insert succeed/n");

              break;

         case 2:

              scanf("%s",&s);

              if(x.trie_search(s))

                   printf("yes/n");

                      else

                   printf("no/n");

              break;

         case 3:

              scanf("%s",&s);

              if(x.trie_del(s))

                   printf("yes/n");

              else

                   printf("no/n");

              break;

         case 4:

              str2 = "";

              print(x.root,str2);

              break;

         default:

              ;

         }

     printf("1.插入/n");

     printf("2.查找/n");

     printf("3.删除/n");

     printf("4.深度遍历/n");

     }

 

     return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值