Skip to content

Commit 947ace6

Browse files
committed
Trie having method for insertion, deletion, searching and printing contents of it
1 parent 20e9877 commit 947ace6

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include <bits/stdc++.h>
2+
#define ll long long int
3+
using namespace std;
4+
struct node
5+
{
6+
bool word_end;
7+
map<char,node*> m;
8+
};
9+
node* getnode(){
10+
node* temp = new node;
11+
temp->word_end =false;
12+
temp->m = map<char,node*>();
13+
return temp;
14+
}
15+
node* insert(node* start,string s){
16+
int i=0,n=s.size();
17+
for(i=0;i<n;i++)
18+
{
19+
map<char,node*>::iterator it = start->m.find(s[i]);
20+
if(it==start->m.end())
21+
{
22+
node* temp = getnode();
23+
start->m.insert(make_pair(s[i],temp));
24+
start = temp;
25+
}
26+
else
27+
start = (*it).second;
28+
}
29+
start->word_end = true;
30+
}
31+
bool find(node* start,string s){
32+
int i=0,n=s.size();
33+
for(i=0;i<n;i++)
34+
{
35+
map<char,node*>::iterator it = start->m.find(s[i]);
36+
if(it==start->m.end())
37+
return false;
38+
start = (*it).second;
39+
}
40+
if(start->word_end==true)
41+
return true;
42+
else
43+
return false;
44+
}
45+
bool delete_util(node* start,string s,int begin,int end){
46+
if(begin==end)
47+
{
48+
if(!start->word_end)
49+
return false;
50+
else
51+
{
52+
if(!start->m.size())
53+
{
54+
free(start);
55+
return true;
56+
}
57+
else
58+
start->word_end = false;
59+
}
60+
}
61+
else
62+
{
63+
map<char,node*>::iterator it = start->m.find(s[begin]);
64+
if(it==start->m.end())
65+
return false;
66+
bool temp = delete_util((*it).second,s,begin+1,end);
67+
if(temp==false)
68+
return false;
69+
else
70+
{
71+
start->m.erase(s[begin]);
72+
if(start->m.size()==0)
73+
{
74+
free(start);
75+
return true;
76+
}
77+
else
78+
return false;
79+
}
80+
}
81+
}
82+
void delete_node(node* start,string s){
83+
delete_util(start,s,0,s.size());
84+
}
85+
void level_order(node* start){
86+
queue<node*> q;
87+
q.push(start);
88+
q.push(getnode());
89+
while(!q.empty())
90+
{
91+
node* temp = q.front();
92+
q.pop();
93+
if(temp->m.size()==0)
94+
{
95+
if(q.empty())
96+
break;
97+
cout<<"\n";
98+
q.push(temp);
99+
}
100+
else
101+
{
102+
map<char,node*>::iterator it = temp->m.begin();
103+
for(it;it!=temp->m.end();it++)
104+
{
105+
cout<<(*it).first;
106+
node* t = (*it).second;
107+
if(t->m.size()>0)
108+
q.push(t);
109+
}
110+
cout<<" ";
111+
}
112+
}
113+
}
114+
void print_words(node* start,string s){
115+
if(start->m.size()==0){
116+
if(s.size()!=0)
117+
cout<<s<<" ";
118+
}
119+
for(map<char,node*>::iterator it=start->m.begin();it!=start->m.end();it++)
120+
print_words((*it).second,s+(*it).first);
121+
}
122+
int main()
123+
{
124+
node* start = getnode();
125+
int t;
126+
cin>>t;
127+
string s;
128+
while(t--)
129+
{
130+
cin>>s;
131+
insert(start,s);
132+
}
133+
//level_order(start);
134+
135+
//To find a something in the trie
136+
//cout<<find(start,"william")<<"\n";
137+
138+
//To delete from trie
139+
//delete_node(start,"wilsoni");
140+
141+
//To print all the data from trie
142+
//print_words(start,"");
143+
144+
return 0;
145+
}
146+

0 commit comments

Comments
 (0)