#ifndef __BSTREE_HPP #define __BSTREE_HPP #include "bintree.hpp" template class BinSearchTree : public BinTree { public: using P = BinTreePosition; using MP = BinTreeMutatingPosition; using BinTree::root; using BinTree::mutatingRoot; template static P searchFrom(P pos, T const& x) { while(pos && *pos != x) if (x < *pos) --pos; else ++pos; // !pos || *pos == x return pos; } P search(T const& x) const { return searchFrom(root(), x); } MP search(T const& x) { return searchFrom(mutatingRoot(), x); } bool insert(T const& x) { MP pos = search(x); if (pos) return false; pos.createLeaf(x); return true; } bool remove(T const& x) { MP pos = search(x); if (!pos) return false; if (!-pos) pos.transfer(+pos); else if (!+pos) pos.transfer( -pos); else { // търсим най-малкия елемент в дясното поддърво MP min = +pos; while (-min) --min; // -min е невалидна позиция, т.е. min е позицията на минималното дърво *pos = *min; min.transfer( +min); } return true; } }; #endif