#ifndef BST_HPP # define BST_HPP # include // std::allocator # include // NULL, size_t, ptrdiff_t # include // max() # include // std::less() # include "reverse_iterator.hpp" # include "equal.hpp" # include "lexicographical_compare.hpp" # include "pair.hpp" # include "bst_node.hpp" # include "bst_iterator.hpp" namespace ft { template < typename Key, typename T, typename Compare = std::less, typename Allocator = std::allocator< ft::pair > > class Bst { public: typedef Key key_type; typedef T mapped_type; typedef pair value_type; typedef Compare key_compare; typedef Allocator allocator_type; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer; typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef Bst_iterator iterator; typedef Bst_const_iterator const_iterator; typedef ft::reverse_iterator reverse_iterator; typedef ft::reverse_iterator const_reverse_iterator; // Member functions explicit Bst(const Compare& comp = Compare(), const Allocator& alloc = Allocator() ); template < typename InputIt > Bst(InputIt first, InputIt last, const Compare& comp = Compare(), const Allocator& alloc = Allocator()); Bst(const Bst& src); ~Bst(); Bst& operator=(const Bst& rhs); // Element access T& operator[](const Key& key); // Iterators iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; // Capacity bool empty() const; size_type size() const; size_type max_size() const; // Modifiers void clear(); pair insert(const value_type& value); iterator insert(iterator hint, const value_type& value); template < typename InputIt > void insert(InputIt first, InputIt last); void erase(iterator pos); void erase(iterator first, iterator last); size_type erase(const Key& key); void swap(Bst& other); // Lookup iterator find(const Key& key); const_iterator find(const Key& key) const; size_type count(const Key& key) const; private: size_type _size; node* _root; node_sentinel* _sentinel; Compare _comp; Allocator _allocator; // TODO : rebind syntaxe pas clair. typename Allocator::template rebind< node >::other _allocator_node; // Peu clair, verifier syntaxe typename Allocator::template rebind< node_sentinel >::other _allocator_node_sentinel; // Peu clair, verifier syntaxe void _init_sentinel(); pair _insert(const value_type& value); node* _erase(iterator pos); node* _subtree_shift(node* st_old, node* st_new); // AVL Balancing void _insert_rebalancing(node* n); void _erase_rebalancing(node* n); short _compute_height(node* n); short _bf(node* n); // balance factor node* _rotate_left(node* n); node* _rotate_right(node* n); }; // Non-member functions template < typename Key, typename T, typename Compare, typename Alloc > bool operator==(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator!=(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator<(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator>(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator<=(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator>=(const Bst& lhs, const Bst& rhs); template < typename Key, typename T, typename Compare, typename Alloc > void swap(Bst& lhs, Bst& rhs); } // namespace ft # include "bst.tpp" // https://en.wikipedia.org/wiki/Binary_search_tree // https://en.wikipedia.org/wiki/AVL_tree // https://fr.wikipedia.org/wiki/Arbre_binaire_de_recherche // https://fr.wikipedia.org/wiki/Arbre_AVL // https://visualgo.net/en/bst // https://visualgo.net/en/bst?slide=14-8 // --> to 14-13 #endif