19template <
typename T>
class tree {
23 std::shared_ptr<node> right;
24 std::shared_ptr<node> left;
25 node(T info) : info(info), left(
nullptr), right(
nullptr) {}
29 std::shared_ptr<node> root;
37 inline explicit tree(std::vector<std::pair<std::string, T>> v = {})
noexcept : root(nullptr) {
39 for (std::pair<std::string, T>& x : v) {
40 this->insert(x.first, x.second);
50 inline void insert(std::string direction, T info) {
51 std::shared_ptr<node> nn = std::make_shared<node>(info);
58 std::shared_ptr<node> head = root;
59 while (head && i < direction.size() - 1) {
60 if (direction[i] ==
'r') {
67 if (head && direction[i] ==
'r') {
69 }
else if (head && direction[i] ==
'l') {
82 std::queue<std::shared_ptr<node>> q;
85 int64_t size = q.size();
86 for (int64_t i = 0; i < size; ++i) {
87 std::shared_ptr<node> current = q.front();
89 if (current->info == key) {
93 q.push(current->right);
96 q.push(current->left);
105 inline Iterator begin() {
106 std::vector<T> ino = this->inorder();
107 return Iterator(0, ino);
110 inline Iterator end() {
111 std::vector<T> ino = this->inorder();
112 return Iterator(ino.size(), ino);
121 _inorder([&](std::shared_ptr<node> callbacked) { ino.push_back(callbacked->info); }, root);
131 _postorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
142 _preorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
152 std::vector<std::vector<T>> path;
153 std::queue<std::shared_ptr<node>> q;
156 size_t size = q.size();
157 std::vector<T> level;
158 for (
size_t i = 0; i < size; i++) {
159 std::shared_ptr<node> current = q.front();
161 level.push_back(current->info);
163 q.push(current->left);
165 if (current->right) {
166 q.push(current->right);
169 path.push_back(level);
178 std::vector<T> order = t.
inorder();
179 for (
int i = 0; i < order.size(); i++) {
180 if (i != order.size() - 1) {
181 out << order[i] <<
", ";
183 out << order[i] <<
'\n';
193#ifdef TREE_VISUALIZATION_H
194 inline void visualize() {
195 std::string _generated = generate_visualization();
196 tree_visualization::visualize(_generated);
201 void _inorder(std::function<
void(std::shared_ptr<node>)> callback, std::shared_ptr<node> root) {
203 _inorder(callback, root->left);
205 _inorder(callback, root->right);
209 void _preorder(std::function<
void(std::shared_ptr<node>)> callback,
210 std::shared_ptr<node> root) {
213 _preorder(callback, root->left);
214 _preorder(callback, root->righ);
218 void _postorder(std::function<
void(std::shared_ptr<node>)> callback,
219 std::shared_ptr<node> root) {
221 _postorder(callback, root->right);
223 _postorder(callback, root->left);
227 std::string generate_visualization() {
228 std::string _generate = _inorder_gen(root);
232 std::string _inorder_gen(std::shared_ptr<node> root) {
234 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
238 _s += root->left->info;
240 _s += _inorder_gen(root->left);
245 _s += root->right->info;
247 _s += _inorder_gen(root->right);
251 _s += std::to_string(root->info) +
"->" + std::to_string(root->left->info) +
"\n" +
252 _inorder_gen(root->left);
255 _s += std::to_string(root->info) +
"->" + std::to_string(root->right->info) +
"\n" +
256 _inorder_gen(root->right);