Trie Data Structure

MRParag007 5,853 views 168 slides Aug 16, 2014
Slide 1
Slide 1 of 168
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131
Slide 132
132
Slide 133
133
Slide 134
134
Slide 135
135
Slide 136
136
Slide 137
137
Slide 138
138
Slide 139
139
Slide 140
140
Slide 141
141
Slide 142
142
Slide 143
143
Slide 144
144
Slide 145
145
Slide 146
146
Slide 147
147
Slide 148
148
Slide 149
149
Slide 150
150
Slide 151
151
Slide 152
152
Slide 153
153
Slide 154
154
Slide 155
155
Slide 156
156
Slide 157
157
Slide 158
158
Slide 159
159
Slide 160
160
Slide 161
161
Slide 162
162
Slide 163
163
Slide 164
164
Slide 165
165
Slide 166
166
Slide 167
167
Slide 168
168

About This Presentation

It Is About Trie Data Structure


Slide Content

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 Standard Tries Compressed Tries 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: print 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 C haracter Value (A – Z) / (a – z). I ndicates Whether This Node Completes A Word Represents The 26 Letters In The Alphabet

NODE STRUCTURE char value bool end 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 ALGORITHM Insert : 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 … 10 … 20 … 26 NULL

INSERTION ALGORITHM Insert : Apple Root

INSERTION ALGORITHM Insert : Apple Second Convert All Of The String’s Character To Uppercase Or To Lowercase. char currentChar = tolower( word.at ( i ));

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : 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 ALGORITHM Insert : 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 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 ALGORITHM Insert : Apple A p p l e 1 2 3 4

INSERTION ALGORITHM Insert : Apple A p p l e 1 2 3 4 char currentChar = tolower( word.at (0)); currentChar a

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Apple Declare A Pointer Node Type Pointer Variable That Point To The Root Node *currentNode = root; Root currentNode Pointing To

INSERTION ALGORITHM Insert : Apple Root currentNode

INSERTION ALGORITHM Insert : Apple if (currentNode->children[0] != NULL) { currentNode = currentNode->children[0]; } false … 10 … 20 … 26 NULL If 0 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHM Insert : 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 … 10 … 20 … 26 NULL

INSERTION ALGORITHM Insert : Apple else { Node *newNode = new Node(currentChar); currentNode->children[0] = newNode; currentNode = newNode; } So………. Node Constructor

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar a Node(currentChar)

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar a a Node(currentChar)

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar a a Node(currentChar) a newNode All 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHM Insert : Apple currentNode->children[0] = newNode; So………. a newNode Root currentNode

INSERTION ALGORITHM Insert : Apple currentNode->children[0] = newNode; So………. a newNode Root currentNode

INSERTION ALGORITHM Insert : Apple currentNode = newNode; So………. a newNode Root currentNode

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Apple So………. a newNode Root currentNode bool end will be false

INSERTION ALGORITHM Insert : Apple Root a currentNode

INSERTION ALGORITHM Insert : Apple A p p l e 1 2 3 4 char currentChar = tolower( word.at (1)); currentChar p

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Apple if (currentNode->children[15] != NULL) { currentNode = currentNode->children[15]; } a false 15 … 10 … 20 … 26 NULL If 15 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHM Insert : Apple if (currentNode->children[15] != NULL) { currentNode = currentNode->children[15]; } Check If The Current Node Has The Current Character As One Of Its Descendants a false 15 … 10 … 20 … 26 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 ALGORITHM Insert : Apple else { Node *newNode = new Node(currentChar); currentNode->children[15] = newNode; currentNode = newNode; } So………. Node Constructor

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar p Node(currentChar)

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar p p Node(currentChar)

INSERTION ALGORITHM Insert : Apple Node *newNode = new Node(currentChar); So………. currentChar p p Node(currentChar) p newNode All 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHM Insert : Apple currentNode->children[15] = newNode; So………. p newNode a currentNode 15

INSERTION ALGORITHM Insert : Apple currentNode->children[15] = newNode; So………. p newNode a 15 currentNode

INSERTION ALGORITHM Insert : Apple currentNode = newNode; So………. p newNode a 15 currentNode

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Apple So………. p newNode a 15 currentNode bool end will be false

INSERTION ALGORITHM Insert : Apple Root a 15 p currentNode

INSERTION ALGORITHM Insert : Apple SIMILARLY

INSERTION ALGORITHM Insert : Apple Root a 15 p 15 p

INSERTION ALGORITHM Insert : Apple Root a 15 p 15 p 11 l

INSERTION ALGORITHM Insert : Apple Root a 15 p 15 p 11 l 4 e

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Apple Root a 15 p 15 p 11 l 4 e bool end will be True

INSERTION ALGORITHM Now Insert : Army

INSERTION ALGORITHM Insert : Army A r m y 1 2 3

INSERTION ALGORITHM Insert : Army A r m y 1 2 3 char currentChar = tolower( word.at (0)); currentChar a

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Army Declare A Pointer Node Type Pointer Variable That Point To The Root Node *currentNode = root; Root currentNode Pointing To

DELETE ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 currentNode

INSERTION ALGORITHM Insert : Army if (currentNode->children[0] != NULL) { currentNode = currentNode->children[0]; } false … 10 … 20 … 26 NULL If 0 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHM Insert : 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 … 10 … 20 … 26 NULL

INSERTION ALGORITHM Insert : Army currentNode = currentNode->children[0]; So……….

INSERTION ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e currentNode bool end will be True

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Army A r m y 1 2 3 char currentChar = tolower( word.at (1)); currentChar r

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } a false 17 … 10 … 20 … 26 NULL If 15 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

INSERTION ALGORITHM Insert : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } Check If The Current Node Has The Current Character As One Of Its Descendants a false 17 … 10 … 20 … 26 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 ALGORITHM Insert : Army else { Node *newNode = new Node(currentChar); currentNode->children[17] = newNode; currentNode = newNode; } So………. Node Constructor

INSERTION ALGORITHM Insert : Army Node *newNode = new Node(currentChar); So………. currentChar r Node(currentChar)

INSERTION ALGORITHM Insert : Army Node *newNode = new Node(currentChar); So………. currentChar r r Node(currentChar)

INSERTION ALGORITHM Insert : Army Node *newNode = new Node(currentChar); So………. currentChar r r Node(currentChar) r newNode All 26 Children Of newNode Will Point To The NULL

INSERTION ALGORITHM Insert : Army currentNode->children[17] = newNode; So……….

INSERTION ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r currentNode

INSERTION ALGORITHM Insert : Army currentNode = newNode; So……….

INSERTION ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r currentNode

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Army SIMILARLY

INSERTION ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15

INSERTION ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y

INSERTION ALGORITHM Insert : 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 ALGORITHM Insert : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y

DELETION

DELETION ALGORITHM Delete : Army A r m y 1 2 3 char currentChar = tolower( word.at (0)); currentChar a

DELETION ALGORITHM Delete : 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 ALGORITHM Delete : Army Declare A Pointer Node Type Pointer Variable That Point To The Root Node *currentNode = root; Root currentNode Pointing To

DELETION ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

DELETION ALGORITHM Delete : Army if (currentNode->children[0] != NULL) { currentNode = currentNode->children[0]; } false … 10 … 20 … 26 NULL If 0 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

DELETION ALGORITHM Delete : 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 … 10 … 20 … 26 NULL

DELETION ALGORITHM Delete : Army currentNode = currentNode->children[0]; So……….

DELETION ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

DELETION ALGORITHM Delete : Army A r m y 1 2 3 char currentChar = tolower( word.at (1)); currentChar r

DELETION ALGORITHM Delete : 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 ALGORITHM Delete : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } a false 17 … 10 … 20 … 26 NULL If 15 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

DELETION ALGORITHM Delete : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } Check If The Current Node Has The Current Character As One Of Its Descendants a false 17 … 10 … 20 … 26 Is 17 Pointing To The NULL? NO! So IF Statement Will Execute………… Here 17 Is The Index Value ( r – ‘a’ ) NULL

DELETION ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

DELETION ALGORITHM Delete : Army SIMILARLY

DELETION ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

DELETION ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

DELETION ALGORITHM Delete : 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 ALGORITHM Delete : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y bool end will be False So Word Couldn’t Be Found By Search So The Word Is Deleted.

SEARCH

SEARCHING ALGORITHM Search : Army A r m y 1 2 3 char currentChar = tolower( word.at (0)); currentChar a

SEARCHING ALGORITHM SEARCH : 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 ALGORITHM Search : Army Declare A Pointer Node Type Pointer Variable That Point To The Root Node *currentNode = root; Root currentNode Pointing To

SEARCHING ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

SEARCHING ALGORITHM Search : Army if (currentNode->children[0] != NULL) { currentNode = currentNode->children[0]; } false … 10 … 20 … 26 NULL If 0 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

SEARCHING ALGORITHM Search : 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 … 10 … 20 … 26 NULL

SEARCHING ALGORITHM Search : Army currentNode = currentNode->children[0]; So……….

SEARCHING ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

SEARCHING ALGORITHM Search : Army A r m y 1 2 3 char currentChar = tolower( word.at (1)); currentChar r

SEARCHING ALGORITHM Search : 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 ALGORITHM Search : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } a false 17 … 10 … 20 … 26 NULL If 15 Pointing To The NULL? Check If The Current Node Has The Current Character As One Of Its Descendants

SEARCHING ALGORITHM Search : Army if (currentNode->children[17] != NULL) { currentNode = currentNode->children[17]; } Check If The Current Node Has The Current Character As One Of Its Descendants a false 17 … 10 … 20 … 26 Is 17 Pointing To The NULL? NO! So IF Statement Will Execute………… Here 17 Is The Index Value ( r – ‘a’ ) NULL

SEARCHING ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

SEARCHING ALGORITHM Search : Army SIMILARLY

SEARCHING ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

SEARCHING ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y currentNode

SEARCHING ALGORITHM Search : 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 ALGORITHM Search : Army Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y Return True. Item Found !

PRINTING WORD

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y

PRINTING ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y if (node->end) (1)

PRINTING ALGORITHM Printing Result CASE RESULT CASE 1 FALSE

PRINTING ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 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 ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y if (node->children[1] != NULL) (3)

PRINTING ALGORITHM Printing Result CASE RESULT CASE 3 FALSE

PRINTING ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y if (node->children[2] != NULL) (4)

PRINTING ALGORITHM Printing Result CASE RESULT CASE 4 FALSE

PRINTING ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 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 ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 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 ALGORITHM 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 ); } } }

PRINTING ALGORITHM Root a 15 p 15 p 11 l 4 e bool end will be True 17 r 12 m 15 y if (node->children[4] != NULL) (19)

PRINTING ALGORITHM 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 ); } } }

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 CODE Trie.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 CODE Trie.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 CODE Trie.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 CODE Trie.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 CODE Trie.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 CODE Trie.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 CODE Main.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