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);
134 node->h =
static_cast<int16_t>(maxOf(heightOf(node->left), heightOf(node->right)) + 1);
136 int16_t balance = balanceOf(node);
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);
245 Node *temp = node->left ? node->left : node->right;
257 Node *minOfRight = node->right;
260 minOfRight = minOfRight->left;
263 node->data = minOfRight->data;
264 node->right = removeNode(node->right, minOfRight->data);
267 Node* newHead = deleteFromList(node, data);
276 node->h =
static_cast<int16_t>(maxOf(heightOf(node->left), heightOf(node->right)) + 1);
278 int16_t balance = balanceOf(node);
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
static int16_t heightOf(const Node *n)
void postOrderTraverseNodeCleanup(Node *n)
static Node * rotateRight(Node *y)
static void appendToEndOf(Node *head, Node *newNode)
Node * deleteFromList(Node *root, T *data)
Node * removeNode(Node *node, T *data)
AvlTree(IPoolAllocator &allocator, std::size_t allocator_quota)
#define UAVCAN_TRACE(...)
static Node * rotateLeft(Node *x)
void postOrderNodeTraverseRecursively(Node *n, std::function< void(Node *&)> forEach)
Node * makeNode(T *payload)
LimitedPoolAllocator allocator_
static int16_t maxOf(int16_t a, int16_t b)
static int16_t balanceOf(Node *n)
Node * insertNode(Node *node, Node *newNode)
static bool linkedListContains(Node *head, const T *data)
void postOrderTraverseRecursively(Node *n, std::function< void(T *&)> forEach)
static NodePtr makeNode(const std::vector< std::string > &iface_names, ClockAdjustmentMode clock_adjustment_mode=SystemClock::detectPreferredClockAdjustmentMode())
void deleteNode(Node *&n)
void walkPostOrder(std::function< void(T *&)> forEach)
void removeEntry(T *data)
bool contains(const T *data) const