-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathTST.cpp
110 lines (93 loc) · 2.34 KB
/
TST.cpp
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
//
// Created by Alex Fridlyand on 7/9/2015.
//
#include "TST.h"
#include <iostream>
#include <algorithm>
using namespace qac;
using namespace std;
TST::TST() : count{0},
root{nullptr} {}
TST::~TST() {
delete root;
}
void TST::insert(std::string query) {
++count;
root = insert(root, query, 0);
}
TST::Node* TST::insert(Node* node, std::string query, int i) {
char c = query[i];
if (!node) {
node = new Node{};
node->c = c;
}
if (c < node->c) {
node->left = insert(node->left, query, i);
} else if (c > node->c) {
node->right = insert(node->right, query, i);
} else if (i < (query.size() - 1)) {
node->mid = insert(node->mid, query, i + 1);
} else {
++node->key_count;
}
return node;
}
int TST::find(std::string key) {
Node* node = find(root, key, 0);
if (!node) {
return 0; // can use experimental/optional
}
return node->key_count;
}
TST::Node* TST::find(Node* node, std::string key, int i) {
if (!node) {
return nullptr;
}
char c = key[i];
if (c < node->c) {
return find(node->left, key, i);
} else if (c > node->c) {
return find(node->right, key, i);
} else if (i < (key.size() - 1)) {
return find(node->mid, key, i + 1);
} else {
return node;
}
}
TST::Node::~Node() {
delete left;
delete mid;
delete right;
}
TST::Queue TST::keysWithPrefix(std::string prefix) {
Queue keys([] (const std::pair<std::string, int> k1, const std::pair<std::string, int> k2) {
return k1.second < k2.second;
});
if (prefix.empty()) {
collect(root, prefix, keys);
} else {
if (auto node = find(root, prefix, 0)) {
collect(node->mid, prefix, keys);
if (node->key_count) { // exact match
keys.push(make_pair(prefix, node->key_count));
}
}
}
return keys;
}
void TST::collect(TST::Node *node, string prefix, Queue& keys) {
if (!node) {
return;
}
if (node->key_count) {
keys.push(make_pair(prefix + node->c, node->key_count));
}
if (node->mid) {
collect(node->mid, prefix + node->c, keys);
}
collect(node->left, prefix, keys);
collect(node->right, prefix, keys);
}
TST::Queue TST::keys() {
return keysWithPrefix("");
}