Trie树的实现

Trie树,又称为字典树或者叫键树,是一种hash树的改进。经常应用于统计和排序大量的字符串,或者查找字符串。

Trie树的结构如下:

 

数据结构如下:

typedef struct iNode
{
 char symbol;
 iNode *first;   //子节点的第一个节点
 iNode *next;  //邻居节点
}iNode;

 

完整代码如下:

View Code
  1 #include<iostream>
  2 #include<iomanip>
  3 using namespace std;
  4 
  5 typedef struct iNode
  6 {
  7     char symbol;
  8     iNode *first;
  9     iNode *next;
 10 }iNode;
 11 
 12 class Trie
 13 {
 14 private:
 15     iNode *root;
 16 public:
 17     Trie();
 18     void insert(char *word);
 19     void print(iNode *curr);
 20     void show();
 21     void search(char *word);
 22 };
 23 
 24 Trie::Trie()
 25 {
 26     iNode *loc = new iNode;
 27     loc->first = NULL;
 28     loc->next = NULL;
 29     root = loc;
 30 }
 31 
 32 void Trie::insert(char *word)
 33 {
 34     iNode *loc;
 35     loc = root;
 36     while(*word)
 37     {
 38         if(loc->first)
 39         {
 40             if(loc->first->symbol == *word)
 41             {
 42                 cout<<loc->first->symbol<<" exist"<<endl;
 43                 loc = loc->first;
 44             }
 45             else
 46             {
 47                 iNode *temploc;
 48                 temploc = loc->first;
 49                 for(loc = loc->first->next; loc; loc = loc->next)
 50                 {
 51                     //cout<<"TEST1"<<endl;
 52                     if(loc->symbol == *word)
 53                     {
 54                         cout<<loc->symbol<<" exist"<<endl;
 55                         break;
 56                     }
 57                     temploc = loc;
 58                 }
 59                 if(!loc)
 60                 {
 61                     iNode *temp = new iNode;
 62                     temp->symbol = *word;
 63                     temp->first = NULL;
 64                     temp->next = NULL;
 65                     temploc->next = temp;
 66                     cout<<"Add new symbol: "<<temploc->next->symbol<<endl;
 67                 }
 68                 loc = temploc->next;
 69             }
 70         }
 71         else
 72         {
 73             iNode *temp = new iNode;
 74             temp->symbol = *word;
 75             temp->first = NULL;
 76             temp->next = NULL;
 77             loc->first = temp;
 78             cout<<"Add new symbol: "<<loc->first->symbol<<endl;
 79             loc = loc->first;
 80         }
 81         word++;
 82         
 83     }
 84 }
 85 
 86 void Trie::print(iNode *cur)
 87 {
 88     iNode *loc;
 89     loc = cur;
 90     while(loc)
 91     {
 92         iNode *temp = loc, *temp1 = loc;
 93         if(temp)
 94         {
 95             print(temp->next);
 96             cout<<setw(5)<<temp->symbol;
 97         }
 98         cout<<endl;
 99         loc = loc->first;
100     }
101     cout<<endl;
102 }
103 
104 void Trie::show()
105 {
106     print(this->root->first);
107 }
108 
109 void Trie::search(char *word)
110 {
111     iNode *loc;
112     char *ch = word;
113     loc = this->root->first;
114     while(*word)
115     {
116         while(loc)
117         {
118             if(loc->symbol == *word)
119             {
120                 cout<<loc->symbol<<" exists in the trie"<<endl;
121                 break;
122             }
123             else
124             {
125                 loc = loc->next;
126             }
127         }
128         if(loc == NULL)
129         {
130             cout<<"String \""<<ch<<"\" not exist in the trie"<<endl<<endl;
131             break;
132         }
133         word++;
134         loc = loc->first;
135     }
136     if(*word == '\0')
137     {
138         cout<<"String \""<<ch<<"\" exists in the trie"<<endl<<endl;
139     }
140 
141 }
142 
143 int main()
144 {
145     Trie t;
146     t.insert("ab");
147     t.show();
148     t.insert("abc");
149     t.show();
150     t.insert("search");
151     t.show();
152     t.insert("serah");
153     t.show();
154     t.search("abc");
155     t.search("abd");
156     t.search("serah");
157 
158     return 0;
159 }

 

转载于:https://www.cnblogs.com/nuaa-zhou/archive/2012/09/14/2685515.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值