6template <
typename T>
int AVLTree<T>::get_height(
const Node<T> *node)
const
13 return node->get_height_val();
16template <
typename T>
int AVLTree<T>::get_balance_factor(
const Node<T> *node)
const
23 return get_height(node->get_left()) - get_height(node->get_right());
26template <
typename T>
void AVLTree<T>::update_height(Node<T> *node)
33 int left_h = get_height(node->get_left());
34 int right_h = get_height(node->get_right());
36 node->set_height_val(1 + std::max(left_h, right_h));
39template <
typename T> std::unique_ptr<Node<T>> AVLTree<T>::rotate_left(std::unique_ptr<Node<T>> node)
41 std::unique_ptr<Node<T>> new_root = node->detach_right();
43 node->set_right(new_root->detach_left());
45 new_root->set_left(std::move(node));
47 update_height(new_root->get_left());
48 update_height(new_root.get());
53template <
typename T> std::unique_ptr<Node<T>> AVLTree<T>::rotate_right(std::unique_ptr<Node<T>> node)
55 std::unique_ptr<Node<T>> new_root = node->detach_left();
57 node->set_left(new_root->detach_right());
59 new_root->set_right(std::move(node));
61 update_height(new_root->get_right());
62 update_height(new_root.get());
67template <
typename T> std::unique_ptr<Node<T>> AVLTree<T>::rebalance(std::unique_ptr<Node<T>> node)
69 update_height(node.get());
71 int balance = get_balance_factor(node.get());
75 if (get_balance_factor(node->get_left()) < 0)
77 node->set_left(rotate_left(node->detach_left()));
79 return rotate_right(std::move(node));
84 if (get_balance_factor(node->get_right()) > 0)
86 node->set_right(rotate_right(node->detach_right()));
88 return rotate_left(std::move(node));
96 this->p_head = insert_helper(std::move(this->p_head),
val);
108 node->set_left(insert_helper(node->detach_left(), val));
110 else if (val > node->get_data())
112 node->set_right(insert_helper(node->detach_right(), val));
119 return rebalance(std::move(node));
124 this->p_head = remove_helper(std::move(this->p_head),
val);
136 node->
set_left(remove_helper(node->detach_left(), val));
138 else if (val > node->get_data())
140 node->
set_right(remove_helper(node->detach_right(), val));
144 if (node->get_left() ==
nullptr)
148 else if (node->get_right() ==
nullptr)
150 return node->detach_left();
152 Node<T> *temp = node->get_right();
153 while (temp->get_left() !=
nullptr)
155 temp = temp->get_left();
158 node->set_data(temp->get_data());
160 node->set_right(remove_helper(node->detach_right(), temp->get_data()));
163 return rebalance(std::move(node));
void remove(const T &val) override
void insert(const T &val) override
static std::unique_ptr< Node< T > > make_node(const T &val)
void set_left(Node< T > *parent, std::unique_ptr< Node< T > > left_child)
std::unique_ptr< Node< T > > detach_right()
const T & get_data() const
void set_right(std::unique_ptr< Node< T > > node)