-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTernarySearchTree.java
More file actions
127 lines (112 loc) · 3.53 KB
/
Copy pathTernarySearchTree.java
File metadata and controls
127 lines (112 loc) · 3.53 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import java.util.Vector;
public class TernarySearchTree {
private Node root;
private Vector<String> traversedArr = new Vector<>();
public Vector<String> getTraversedArr() {
return traversedArr;
}
private Node insertUtil(Node r, char[] word, int pos) {
if (r == null) {
r = new Node(word[pos]);
}
if (word[pos] < r.getData()) {
r.left = insertUtil(r.left, word, pos);
}
else if (word[pos] > r.getData()) {
r.right = insertUtil(r.right, word, pos);
}
else {
if (pos + 1 < word.length) {
r.middle = insertUtil(r.middle, word, pos + 1);
}
else r.setEnding(true);
}
return r;
}
public void insert(String word) {
root = insertUtil(root, word.toCharArray(), 0);
}
private void deleteUtil(Node r, char[] input, int pos) {
// Base case
if(r == null) return;
if(input[pos] < r.getData()) {
deleteUtil(r.left, input, pos);
}
else if(input[pos] > r.getData()) {
deleteUtil(r.right, input, pos);
}
else {
if(pos == input.length - 1 && r.getEnding()) {
// Remove isEndOfString flag
r.setEnding(false);
return;
}
else {
deleteUtil(r.middle, input, pos + 1);
}
}
}
public void delete(String word) {
deleteUtil(root, word.toCharArray(), 0);
}
private void traverse(Node r, String pattern, char[] word, int depth) {
if (r != null)
{
// First traverse the left subtree
traverse(r.left, pattern, word, depth);
// Store the character of this node
word[depth] = r.getData();
if (r.getEnding())
{
word[depth+1] = '\0';
traversedArr.add(pattern + String.valueOf(word));
}
// Traverse the subtree using middle pointer
traverse(r.middle, pattern, word, depth + 1);
// Finally Traverse the right subtree
traverse(r.right, pattern, word, depth);
}
}
private void autoCompleteArr(Node r, String pattern) {
char[] word = new char[100];
if(r.getEnding()) {
traversedArr.add(pattern);
}
traverse(r, pattern, word, 0);
}
private void nodeIdentify(Node r, String pattern, int pos) {
char[] input = pattern.toCharArray();
while(r != null && pos < pattern.length()) {
int compareChars = Character.compare(r.getData(), input[pos]);
if(compareChars > 0) {
r = r.left;
}
else if(compareChars < 0) {
r = r.right;
}
else if(compareChars == 0) {
r = r.middle;
pos++;
}
}
if(r == null) {
System.out.println("NOT FOUND!");
return;
}
autoCompleteArr(r, pattern);
}
public void autoComplete(String pattern) {
if(pattern.isEmpty()) {
return;
}
// Identify starting node in TST
nodeIdentify(root, pattern, 0);
// printArray();
}
// private void printArray() {
// Iterator<String> value = traversedArr.iterator();
// while (value.hasNext()) {
// System.out.println(value.next());
// }
// }
}