6 #ifndef UAVCAN_UTIL_AVL_TREE_HPP_INCLUDED
7 #define UAVCAN_UTIL_AVL_TREE_HPP_INCLUDED
51 postOrderTraverseRecursively(n->left, forEach);
52 postOrderTraverseRecursively(n->right, forEach);
57 void* praw = this->allocator_.allocate(
sizeof(
Node));
74 allocator_.deallocate(n);
84 return static_cast<int16_t>(heightOf(n->left) - heightOf(n->right));
98 y->h =
static_cast<int16_t>(maxOf(heightOf(y->left), heightOf(y->right)) + 1);
99 x->h =
static_cast<int16_t>(maxOf(heightOf(
x->left), heightOf(
x->right)) + 1);
111 x->h =
static_cast<int16_t>(maxOf(heightOf(
x->left), heightOf(
x->right)) + 1);
112 y->h =
static_cast<int16_t>(maxOf(heightOf(y->left), heightOf(y->right)) + 1);
124 if (*newNode->data < *
node->data) {
125 node->left = insertNode(
node->left, newNode);
126 }
else if (*newNode->data > *
node->data) {
127 node->right = insertNode(
node->right, newNode);
130 appendToEndOf(
node, newNode);
138 if (balance > 1 && (*newNode->data < *
node->left->data)) {
139 return rotateRight(
node);
142 if (balance < -1 && (*newNode->data > *
node->right->data)) {
143 return rotateLeft(
node);
146 if (balance > 1 && (*newNode->data > *
node->left->data)) {
147 node->left = rotateLeft(
node->left);
148 return rotateRight(
node);
151 if (balance < -1 && (*newNode->data < *
node->right->data)) {
152 node->right = rotateRight(
node->right);
153 return rotateLeft(
node);
162 target = target->equal_keys;
165 target->equal_keys = newNode;
172 Node* current = root;
176 if (current->data == data) {
177 if (current == root) {
178 Node* ret = current->equal_keys;
182 ret->left = current->left;
183 ret->right = current->right;
190 Node* next = current->equal_keys;
191 prev->equal_keys = next;
199 current = current->equal_keys;
210 postOrderTraverseNodeCleanup(n->left);
211 postOrderTraverseNodeCleanup(n->right);
228 postOrderNodeTraverseRecursively(n->left, forEach);
229 postOrderNodeTraverseRecursively(n->right, forEach);
238 if (*data < *node->data) {
239 node->left = removeNode(
node->left, data);
240 }
else if (*data > *
node->data) {
241 node->right = removeNode(
node->right, data);
260 minOfRight = minOfRight->left;
263 node->data = minOfRight->data;
264 node->right = removeNode(
node->right, minOfRight->data);
267 Node* newHead = deleteFromList(
node, data);
280 if (balance > 1 && balanceOf(
node->left) >= 0) {
281 return rotateRight(
node);
284 if (balance > 1 && balanceOf(
node->left) < 0) {
285 node->left = rotateLeft(
node->left);
286 return rotateRight(
node);
289 if (balance < -1 && balanceOf(
node->right) <= 0) {
290 return rotateLeft(
node);
293 if (balance < -1 && balanceOf(
node->right) > 0) {
294 node->right = rotateRight(
node->right);
295 return rotateLeft(
node);
304 if (next->data == data) {
307 next = next->equal_keys;
316 , allocator_(allocator, allocator_quota)
321 postOrderTraverseNodeCleanup(this->root_);
325 root_ = removeNode(root_, data);
334 root_ = insertNode(root_, newNode);
344 postOrderTraverseRecursively(root_, forEach);
349 return getSize() == 0;
369 if (*n->data < *data) {
374 if (*n->data > *data) {
379 return linkedListContains(n, data);
387 #endif // UAVCAN_UTIL_AVL_TREE_HPP_INCLUDED