14template <
typename T>
class BST;
16template <
typename T>
class Node
23 std::unique_ptr<Node<T>> p_left;
24 std::unique_ptr<Node<T>> p_right;
28 explicit Node(T val) : m_data(val), p_left(nullptr), p_right(nullptr), m_height(1)
32 : m_data(val), p_left(std::move(left)), p_right(std::move(right)), m_height(1)
81 static std::unique_ptr<Node<T>>
make_node(
const T &val);
82 static std::unique_ptr<Node<T>>
make_node(
const T &val, std::unique_ptr<
Node<T>> left,
83 std::unique_ptr<
Node<T>> right);
91 void insert_iterative(
Node<T> *node,
const T &val);
92 std::unique_ptr<Node<T>> remove_impl(std::unique_ptr<
Node<T>> node,
const T &val);
96 virtual void insert(
const T &val);
98 virtual void remove(
const T &val);
109 int get_height(
const Node<T> *node)
const;
110 int get_balance_factor(
const Node<T> *node)
const;
111 void update_height(
Node<T> *node);
113 std::unique_ptr<Node<T>> rotate_left(std::unique_ptr<
Node<T>> node);
114 std::unique_ptr<Node<T>> rotate_right(std::unique_ptr<
Node<T>> node);
115 std::unique_ptr<Node<T>> rebalance(std::unique_ptr<
Node<T>> node);
117 std::unique_ptr<Node<T>> insert_helper(std::unique_ptr<
Node<T>> node,
const T &val);
118 std::unique_ptr<Node<T>> remove_helper(std::unique_ptr<
Node<T>> node,
const T &val);
121 void insert(
const T &val)
override;
122 void remove(
const T &val)
override;
127#include "../src/avl.tpp"
128#include "../src/binary_tree.tpp"
129#include "../src/bst.tpp"
130#include "../src/node.tpp"
void remove(const T &val) override
void insert(const T &val) override
T get_predecessor(const T &val) const
virtual void insert(const T &val)
T get_successor(const T &val) const
virtual void remove(const T &val)
bool contains(const T &val) const
static std::unique_ptr< Node< T > > make_node(const T &val)
BinaryTree & operator=(BinaryTree &&other) noexcept=default
int compute_size(const Node< T > *node) const
void print_levelorder() const
void postorder(const Node< T > *node) const
void set_left(Node< T > *parent, std::unique_ptr< Node< T > > left_child)
virtual ~BinaryTree()=default
void print_preorder() const
BinaryTree(BinaryTree &&other) noexcept=default
void set_root(std::unique_ptr< Node< T > > root)
Node< T > * get_root() const
void inorder(const Node< T > *node) const
void preorder(const Node< T > *node) const
void print_inorder() const
void set_right(Node< T > *parent, std::unique_ptr< Node< T > > right_child)
void levelorder(const Node< T > *node) const
BinaryTree & operator=(const BinaryTree &other)
void print_postorder() const
std::unique_ptr< Node< T > > p_head
std::unique_ptr< Node< T > > detach_left()
int get_height_val() const
void set_left(std::unique_ptr< Node< T > > node)
Node(Node &&other) noexcept=default
std::unique_ptr< Node< T > > detach_right()
Node & operator=(const Node &other)
const T & get_data() const
Node< T > * get_right() const
Node & operator=(Node &&other) noexcept=default
void set_right(std::unique_ptr< Node< T > > node)
Node< T > * get_left() const
Node(T val, std::unique_ptr< Node< T > > left, std::unique_ptr< Node< T > > right)
void set_data(const T &val)
void set_height_val(int h)