insert
This commit is contained in:
commit
c32200907a
|
@ -0,0 +1,94 @@
|
|||
#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();
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue