Trie Data Structure
-
Upload
- -
Category
Engineering
-
view
429 -
download
3
description
Transcript of Trie Data Structure
DATA STRUCTURE
TRIE
Name: Mahadi Hassan
ID: 1320133042
&
Name: Mahmud Rahman Parag
ID: 1320900042
What Is TRIE?
Trie Is An Efficient Information Retrieval Data Structure Also Called Digital Tree And Sometimes Radix Tree Or Prefix Tree (As They Can Be Searched By Prefixes), Is An Ordered Tree Data Structure That Is Used To Store A Dynamic Set Or Associative Array Where The Keys Are Usually Strings.
Why Trie Data Structure?
• Searching trees in general favor keys which are of fixed
size since this leads to efficient storage management.
• However in case of applications which are retrieval
based and which call for keys varying length, tries
provide better options.
• Tries are also called as Lexicographic Search trees.
• The name trie (pronounced as “try”)originated from the
word “retrieval”.
TYPES OF TRIE
1.Standard Tries
2.Compressed Tries
3.Suffix Tries
STANDARD TRIE
The Standard Trie For A Set Of Strings S Is An Ordered Tree Such That:
Each Node Labeled With A Character (Without Root).
The Children Of A Node Are Alphabetically Ordered.
The Paths From The External Nodes To The Root Yield The Strings Of S
EXAMPLE:
Standard Trie For A Set Of Strings S
S = { bear, bell, bid, bull, buy, sell, stock, stop }
TIME COMPLEXITY
A Standard Trie Uses O(n) Space. Operations (find, insert, remove) Take Time
O(dm) Each, Where:
n = Total Size Of The Strings In S,
m = Size Of The String Parameter Of The Operation
d = Alphabet Size
TRIE SPECIFICATION
Operations:
addWord
Function Adds word to an .
Postcondition Trie is not full
searchWord
Function Search a word in the trie
Postcondition Returns true if the world is found and false otherwise.
deleteWord
Function Delete a word in the trie
Postcondition Trie is not empty
TRIE SPECIFICATION
Operations:
Function Print the word in the trie
Postcondition Trie either maybe full or not
NODE STRUCTURE
Class Node
{
public:
char value;
bool end;
Node *children[26];
}
The Character Value (A – Z) / (a – z).
Indicates Whether This Node Completes A Word
Represents The 26 Letters In The Alphabet
NODE STRUCTURE
char value
bool end
0 1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Character Data
Boolean Data
A Node Type Pointer Array
\0
INSERTION
INSERTION ALGORITHMInsert: Apple
First Create A Root That Has Empty String And Every Single Pointer Array Must Point To The NULL (Default). And Boolean Value Of Every Node Must Be false By Default.
false
0 … 10 … 2
0 … 26
NULL
INSERTION ALGORITHMInsert: Apple
Root
INSERTION ALGORITHMInsert: Apple
Second Convert All Of The String’s Character To Uppercase Or To Lowercase.
char currentChar = tolower(word.at(i));
INSERTION ALGORITHMInsert: Apple
Second Convert All Of The String’s Character To Uppercase Or To Lowercase.
char currentChar = tolower(word.at(i));
Here, Suppose string s = “Apple” And Length Of String Is 5 So……….
INSERTION ALGORITHMInsert: Apple
Second Convert All Of The String’s Character To Uppercase Or To Lowercase.
char currentChar = tolower(word.at(i));
Here, Suppose string s = “Apple” And Length Of String Is 5 So……….
s[0] = A, s[1] = p, s[2] = p, s[3] = l, s[4] = e
INSERTION ALGORITHMInsert: Apple
Second Convert All Of The String’s Character To Uppercase Or To Lowercase.
char currentChar = tolower(word.at(i));
A p p l e
0 1 2 3 4
Here, Suppose string s = “Apple” And Length Of String Is 5 So……….
s[0] = A, s[1] = p, s[2] = p, s[3] = l, s[4] = e
INSERTION ALGORITHMInsert: Apple
A p p l e
0 1 2 3 4
INSERTION ALGORITHMInsert: Apple
A p p l e
0 1 2 3 4
char currentChar = tolower(word.at(0));
currentChar a
INSERTION ALGORITHMInsert: Apple
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar a
int index = currentChar - 'a'; int index = a - 'a';
int index = 0;
INSERTION ALGORITHMInsert: Apple
Declare A Pointer Node Type Pointer Variable That Point To The Root
Node *currentNode = root;
RootcurrentNodePointing To
INSERTION ALGORITHMInsert: Apple
Root
currentNode
INSERTION ALGORITHMInsert: Apple
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
false
0 … 10 … 2
0 … 26
NULL
If 0 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
INSERTION ALGORITHMInsert: Apple
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
Is 0 Pointing To The NULL?
YES!
So IF Statement Won’t Execute…………
And The Current Node Doesn't have the current character as one of its descendants
Here 0 Is The Index Value ( a – ‘a’ )
Check If The Current Node Has The Current Character As One Of Its Descendants
false
0 … 10 … 2
0 … 26
NULL
INSERTION ALGORITHMInsert: Apple
else
{
Node *newNode = new Node(currentChar);
currentNode->children[0] = newNode;
currentNode = newNode;
}
So………. Node Constructor
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar a
Node(currentChar)
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar a
aNode(currentChar)
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar a
aNode(currentChar)
anewNodeAll 26 Children Of newNode Will Point To The NULL
INSERTION ALGORITHMInsert: Apple
currentNode->children[0] = newNode;
So……….
anewNode RootcurrentNode
0
INSERTION ALGORITHMInsert: Apple
currentNode->children[0] = newNode;
So……….
a
newNode Root0
currentNode
INSERTION ALGORITHMInsert: Apple
currentNode = newNode;
So……….
a
newNode Root0
currentNode
INSERTION ALGORITHMInsert: Apple
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
0 == 4? NO Won’t Execute
INSERTION ALGORITHMInsert: Apple
So……….
a
newNode Root0
currentNode
bool end will be false
INSERTION ALGORITHMInsert: Apple
Root0
acurrentNode
INSERTION ALGORITHMInsert: Apple
A p p l e
0 1 2 3 4
char currentChar = tolower(word.at(1));
currentChar p
INSERTION ALGORITHMInsert: Apple
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar p
int index = currentChar - 'a'; int index = p - 'a';
int index = 15;
INSERTION ALGORITHMInsert: Apple
if (currentNode->children[15] != NULL)
{
currentNode = currentNode->children[15];
}
afalse
15 … 1
0 … 20 … 2
6
NULL
If 15 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
INSERTION ALGORITHMInsert: Apple
if (currentNode->children[15] != NULL)
{
currentNode = currentNode->children[15];
}
Check If The Current Node Has The Current Character As One Of Its Descendants
afalse
15 … 1
0 … 20 … 2
6
Is 15 Pointing To The NULL?
YES!
So IF Statement Won’t Execute…………
And The Current Node Doesn't have the current character as one of its descendants
Here 15 Is The Index Value ( p – ‘a’ )
NULL
INSERTION ALGORITHMInsert: Apple
else
{
Node *newNode = new Node(currentChar);
currentNode->children[15] = newNode;
currentNode = newNode;
}
So………. Node Constructor
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar p
Node(currentChar)
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar p
pNode(currentChar)
INSERTION ALGORITHMInsert: Apple
Node *newNode = new Node(currentChar);
So……….
currentChar p
pNode(currentChar)
pnewNodeAll 26 Children Of newNode Will Point To The NULL
INSERTION ALGORITHMInsert: Apple
currentNode->children[15] = newNode;
So……….
pnewNode acurrentNode
15
INSERTION ALGORITHMInsert: Apple
currentNode->children[15] = newNode;
So……….
p
newNode a15
currentNode
INSERTION ALGORITHMInsert: Apple
currentNode = newNode;
So……….
p
newNode a15
currentNode
INSERTION ALGORITHMInsert: Apple
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
1 == 4? NO Won’t Execute
INSERTION ALGORITHMInsert: Apple
So……….
p
newNode a15
currentNode
bool end will be false
INSERTION ALGORITHMInsert: Apple
Root0
a15
p
currentNode
INSERTION ALGORITHMInsert: Apple
SIMILARLY
INSERTION ALGORITHMInsert: Apple
Root0
a15
p15
p
INSERTION ALGORITHMInsert: Apple
Root0
a15
p15
p11
l
INSERTION ALGORITHMInsert: Apple
Root0
a15
p15
p11
l4
e
INSERTION ALGORITHMInsert: Apple
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
4 == 4? YES Will Execute
INSERTION ALGORITHMInsert: Apple
Root0
a15
p15
p11
l4
e
bool end will be True
INSERTION ALGORITHM
Now Insert: Army
INSERTION ALGORITHMInsert: Army
A r m y
0 1 2 3
INSERTION ALGORITHMInsert: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(0));
currentChar a
INSERTION ALGORITHMInsert: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar a
int index = currentChar - 'a'; int index = a - 'a';
int index = 0;
INSERTION ALGORITHMInsert: Army
Declare A Pointer Node Type Pointer Variable That Point To The Root
Node *currentNode = root;
RootcurrentNodePointing To
DELETE ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
currentNode
INSERTION ALGORITHMInsert: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
false
0 … 10 … 2
0 … 26
NULL
If 0 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
INSERTION ALGORITHMInsert: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
Is 0 Pointing To The NULL?
NO!
So IF Statement Will Execute…………
Here 0 Is The Index Value ( a – ‘a’ )
Check If The Current Node Has The Current Character As One Of Its Descendants
false
0 … 10 … 2
0 … 26
NULL
INSERTION ALGORITHMInsert: Army
currentNode = currentNode->children[0];
So……….
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
currentNode
bool end will be True
INSERTION ALGORITHMInsert: Army
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
0 == 3? NO Won’t Execute
INSERTION ALGORITHMInsert: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(1));
currentChar r
INSERTION ALGORITHMInsert: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar r
int index = currentChar - 'a'; int index = r - 'a';
int index = 17;
INSERTION ALGORITHMInsert: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
afalse
17 … 1
0 … 20 … 2
6
NULL
If 15 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
INSERTION ALGORITHMInsert: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
Check If The Current Node Has The Current Character As One Of Its Descendants
afalse
17 … 1
0 … 20 … 2
6
Is 17 Pointing To The NULL?
YES!
So IF Statement Won’t Execute…………
And The Current Node Doesn't have the current character as one of its descendants
Here 17 Is The Index Value ( r – ‘a’ )
NULL
INSERTION ALGORITHMInsert: Army
else
{
Node *newNode = new Node(currentChar);
currentNode->children[17] = newNode;
currentNode = newNode;
}
So………. Node Constructor
INSERTION ALGORITHMInsert: Army
Node *newNode = new Node(currentChar);
So……….
currentChar r
Node(currentChar)
INSERTION ALGORITHMInsert: Army
Node *newNode = new Node(currentChar);
So……….
currentChar r
rNode(currentChar)
INSERTION ALGORITHMInsert: Army
Node *newNode = new Node(currentChar);
So……….
currentChar r
rNode(currentChar)
rnewNodeAll 26 Children Of newNode Will Point To The NULL
INSERTION ALGORITHMInsert: Army
currentNode->children[17] = newNode;
So……….
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r
currentNode
INSERTION ALGORITHMInsert: Army
currentNode = newNode;
So……….
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r
currentNode
INSERTION ALGORITHMInsert: Army
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
1 == 3? NO Won’t Execute
INSERTION ALGORITHMInsert: Army
SIMILARLY
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
INSERTION ALGORITHMInsert: Army
if (i == word.size() - 1)
{
currentNode->end = true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
3 == 3? YES Will Execute
INSERTION ALGORITHMInsert: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
DELETION
DELETION ALGORITHMDelete: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(0));
currentChar a
DELETION ALGORITHMDelete: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar a
int index = currentChar - 'a'; int index = a - 'a';
int index = 0;
DELETION ALGORITHMDelete: Army
Declare A Pointer Node Type Pointer Variable That Point To The Root
Node *currentNode = root;
RootcurrentNodePointing To
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
DELETION ALGORITHMDelete: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
false
0 … 10 … 2
0 … 26
NULL
If 0 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
DELETION ALGORITHMDelete: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
Is 0 Pointing To The NULL?
NO!
So IF Statement Will Execute…………
Here 0 Is The Index Value ( a – ‘a’ )
Check If The Current Node Has The Current Character As One Of Its Descendants
false
0 … 10 … 2
0 … 26
NULL
DELETION ALGORITHMDelete: Army
currentNode = currentNode->children[0];
So……….
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
DELETION ALGORITHMDelete: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(1));
currentChar r
DELETION ALGORITHMDelete: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar r
int index = currentChar - 'a'; int index = r - 'a';
int index = 17;
DELETION ALGORITHMDelete: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
afalse
17 … 1
0 … 20 … 2
6
NULL
If 15 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
DELETION ALGORITHMDelete: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
Check If The Current Node Has The Current Character As One Of Its Descendants
afalse
17 … 1
0 … 20 … 2
6
Is 17 Pointing To The NULL?
NO!
So IF Statement Will Execute…………
Here 17 Is The Index Value ( r – ‘a’ )
NULL
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
DELETION ALGORITHMDelete: Army
SIMILARLY
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
DELETION ALGORITHMDelete: Army
if (i == word.size() – 1 && currentNode->end)
{
currentNode->end = false;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
3 == 3? && currentNode end? YES Will Execute
DELETION ALGORITHMDelete: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
ybool end will be False So Word Couldn’t Be Found By Search So The Word Is Deleted.
SEARCH
SEARCHING ALGORITHMSearch: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(0));
currentChar a
SEARCHING ALGORITHMSEARCH: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar a
int index = currentChar - 'a'; int index = a - 'a';
int index = 0;
SEARCHING ALGORITHMSearch: Army
Declare A Pointer Node Type Pointer Variable That Point To The Root
Node *currentNode = root;
RootcurrentNodePointing To
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
SEARCHING ALGORITHMSearch: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
false
0 … 10 … 2
0 … 26
NULL
If 0 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
SEARCHING ALGORITHMSearch: Army
if (currentNode->children[0] != NULL)
{
currentNode = currentNode->children[0];
}
Is 0 Pointing To The NULL?
NO!
So IF Statement Will Execute…………
Here 0 Is The Index Value ( a – ‘a’ )
Check If The Current Node Has The Current Character As One Of Its Descendants
false
0 … 10 … 2
0 … 26
NULL
SEARCHING ALGORITHMSearch: Army
currentNode = currentNode->children[0];
So……….
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
SEARCHING ALGORITHMSearch: Army
A r m y
0 1 2 3
char currentChar = tolower(word.at(1));
currentChar r
SEARCHING ALGORITHMSearch: Army
Then Get The Correct Index For The Appropriate Character
int index = currentChar - 'a';
So……….
currentChar r
int index = currentChar - 'a'; int index = r - 'a';
int index = 17;
SEARCHING ALGORITHMSearch: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
afalse
17 … 1
0 … 20 … 2
6
NULL
If 15 Pointing To The NULL?
Check If The Current Node Has The Current Character As One Of Its Descendants
SEARCHING ALGORITHMSearch: Army
if (currentNode->children[17] != NULL)
{
currentNode = currentNode->children[17];
}
Check If The Current Node Has The Current Character As One Of Its Descendants
afalse
17 … 1
0 … 20 … 2
6
Is 17 Pointing To The NULL?
NO!
So IF Statement Will Execute…………
Here 17 Is The Index Value ( r – ‘a’ )
NULL
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
SEARCHING ALGORITHMSearch: Army
SIMILARLY
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
currentNode
SEARCHING ALGORITHMSearch: Army
if (i == word.size() – 1 && currentNode->end)
{
return true;
}
Now Check If It Is The Last Character Of The Word Has Been Reached
3 == 3? && currentNode end? YES Will Execute
SEARCHING ALGORITHMSearch: Army
Root0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
yReturn True. Item Found !
PRINTING WORD
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->end) (1)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 1 FALSE
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[0] != NULL) (2)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 1 FALSE
CASE 2 TRUE
string currentString = prefix + node->children[0]->value;
string currentString = “” +a;
string currentString = a;
alphabetize(node->children[0], currentString);
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[1] != NULL) (3)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 3 FALSE
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[2] != NULL) (4)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 4 FALSE
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[15] != NULL) (17)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 17 TRUE
string currentString = prefix + node->children[15]->value;
string currentString = a + p;
string currentString = ap;
alphabetize(node->children[15], currentString);
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[15] != NULL) (18)
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 18 TRUE
string currentString = prefix + node->children[15]->value;
string currentString = ap + p;
string currentString = app;
alphabetize(node->children[15], currentString);
PRINTING ALGORITHM
SIMILARLY
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHMRoot
0
a15
p15
p11
l4
e
bool end will be True
17
r12
m15
y
if (node->children[4] != NULL) (19)
PRINTING ALGORITHMTrie::alphabetize(Node * node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
PRINTING ALGORITHM
Printing Result
CASE RESULT
CASE 19 TRUE
string currentString = prefix + node->children[15]->value;
string currentString = appl + e;
string currentString = apple;
alphabetize(node->children[4], currentString);
PRINTING ALGORITHM
Printing Result
Print apple
PRINTING ALGORITHM
SIMILARLY
PRINTING ALGORITHM
Printing Result
Print apple
Print army
SOURCE CODETrie.h
#ifndef TRIE_H
#define TRIE_H
#include <iostream>
#include <vector>
#include <string>
#include <assert.h>
#include <new>
using namespace std;
class Node
{
public:
char value;
bool end;
Node *children[26];
Node(char value);
};
class Trie
{
public:
Trie();
void addWord(string word);
bool searchForWord(string word);
void deleteWord(string word);
Node *getRoot();
void alphabetize(Node *, string);
private:
Node *root;
};
#endif // TRIE_H
SOURCE CODETrie.c
#ifndef TRIE_CPP
#define TRIE_CPP
#include <iostream>
#include "trie.h"
using namespace std;
Node::Node(char value)
{
this->value = value;
end = false;
for(int i = 0; i < 26; ++i)
{
children[i] = NULL;
}
}
Trie::Trie()
{
root = new Node(' ');
root->end = true;
}
Node *Trie::getRoot()
{
return root;
}
SOURCE CODETrie.c
void Trie::addWord(string word)
{
Node * currentNode = root;
for (int i = 0; i < (int)word.size(); ++i)
{
char currentChar = tolower(word.at(i));
int index = currentChar - 'a';
assert(index >= 0); // Makes sure the character is between a-z
if (currentNode->children[index] != NULL)
{
// check if the current node has the current character as one of its decendants
currentNode = currentNode->children[index];
}
else
{
// the current node doesn't have the current character as one of its decendants
Node * newNode = new Node(currentChar);
currentNode->children[index] = newNode;
currentNode = newNode;
}
if (i == (int)word.size() - 1)
{
// the last character of the word has been reached
currentNode->end = true;
}
}
}
SOURCE CODETrie.c
bool Trie::searchForWord(string word)
{
Node *currentNode = root;
for(int i = 0; i < (int)word.size(); ++i)
{
char currentChar = tolower(word.at(i));
int index = currentChar - 'a';
assert(index >= 0);
if(currentNode->children[index] != NULL)
{
currentNode = currentNode->children[index];
}
else
{
return false;
}
if(i == (int)word.size() - 1 && !currentNode->end)
{
return false;
}
}
return true;
}
SOURCE CODETrie.c
void Trie::deleteWord(string word)
{
Node *currentNode = root;
for(int i = 0; i < (int)word.size(); ++i)
{
char currentChar = tolower(word.at(i));
int index = currentChar - 'a';
assert(index >= 0);
if(currentNode->children[index] != NULL)
{
currentNode = currentNode->children[index];
}
else
{
return;
}
if(i == (int)word.size() - 1 && currentNode->end)
{
currentNode->end = false;
}
}
}
SOURCE CODETrie.c
void Trie::alphabetize(Node *node, string prefix = "")
{
if (node->end)
cout << prefix << endl;
for (int i = 0; i < 26; ++i)
{
if (node->children[i] != NULL)
{
string currentString = prefix + node->children[i]->value;
alphabetize(node->children[i], currentString);
}
}
}
#endif // TRIE_CPP
SOURCE CODEMain.cpp
#include <iostream>
#include “trie.h”
using namespace std;
int main()
{
Trie * t = new Trie();
t->addWord("Carlos");
t->addWord("Perea");
t->addWord("Hello");
t->addWord("Ball");
t->addWord("Balloon");
t->addWord("Show");
t->addWord("Shower");
t->alphabetize(t->getRoot(), "");
t-> alphabetize(t->getRoot(), "");
return 0;
}
OUTPUT
APPLICATIONS OF TRIE DATA STRUCTURES
TRIES IN AUTO COMPLETE
• Since a trie is a tree-like data structure in which each
node contains an array of pointers, one pointer for each
character in the alphabet.
• Starting at the root node, we can trace a word by
following pointers corresponding to the letters in the
target word.
• Starting from the root node, you can check if a word exists
in the trie easily by following pointers corresponding to
the letters in the target word.
TRIES IN AUTO COMPLETE
• Auto-complete functionality is used widely over the
internet and mobile apps. A lot of websites and apps try to
complete your input as soon as you start typing.
• All the descendants of a node have a common prefix of
the string associated with that node.
TRIES IN AUTO COMPLETE
AUTO COMPLETE IN GOOGLE SEARCH
WHY TRIES IN AUTO COMPLETE
• Implementing auto complete using a trie is easy.
• We simply trace pointers to get to a node that represents
the string the user entered. By exploring the trie from that
node down, we can enumerate all strings that complete
user’s input.
AUTOMATIC COMMAND COMPLETION
• When using an operating system such as Unix or DOS, we
type in system commands to accomplish certain tasks.
For example, the Unix and DOS command cd may be used
to change the current directory.
SPELL CHECKERS
PHONE BOOK SEARCH
THANKS TO EVRYONE