AVLtree/tree.cpp

94 lines
1.9 KiB
C++

#include<fstream>
#include<iostream>
#include<vector>
#include<memory>
template <typename T>
struct Node{
T value;
std::unique_ptr<Node<T>> small;
std::unique_ptr<Node<T>> big;
void dump(std::ofstream& ofs) const;
};
template <typename T>
class Tree{
std::unique_ptr<Node<T>> root;
public:
bool insert(T val);
void del(T val);
void print() const;
};
template <typename T>
void del(T val);
template <typename T>
bool Tree<T>::insert(T val){
std::unique_ptr<Node<T>> node = std::make_unique<Node<T>>();
node->value = val;
if (!root){
root.swap(node);
return true;
}
else{
Node<T>* temp = root.get();
while(temp){
if(val < temp->value){
if(temp->small) temp = temp->small.get();
else{
temp->small.swap(node);
return true;
}
}
else if(val > temp->value){
if(temp->big) temp = temp->big.get();
else{
temp->big.swap(node);
return true;
}
}
else return false;
}
return false;
}
}
template <typename T>
void Node<T>::dump(std::ofstream& ofs) const {
if (small) {
ofs << value << " -> " << small->value << '\n';
small->dump(ofs);
}
if (big) {
ofs << value << " -> " << big->value << '\n';
big->dump(ofs);
}
}
template <typename T>
void Tree<T>::print() const {
std::ofstream ofs;
ofs.open("viz.dot");
ofs << "digraph Tree {\n";
if(root) root->dump(ofs);
ofs << "}";
ofs.close();
system("cat viz.dot | dot -Tx11");
}
int main(){
Tree<int> t;
std::vector<int> v = {3, 6, 8, 0, -1, 1, 4, 2};
for(auto i : v){
if(t.insert(i)) std::cout << "added " << i << "\n";
else std::cout << "failed at " << i << "\n";
t.print();
}
}