1
1
/*
2
- * Copyright (c) 2006-2020, RT-Thread Development Team
2
+ * Copyright (c) 2006-2025 RT-Thread Development Team
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*
10
10
#include <rtthread.h>
11
11
#include <lwp_avl.h>
12
12
13
+ /**
14
+ * @brief Rebalances an AVL tree after insertion or deletion
15
+ *
16
+ * @param[in,out] nodeplaces_ptr Pointer to stack of node pointers that need rebalancing
17
+ * @param[in] count Number of nodes in the stack that need rebalancing
18
+ *
19
+ * @note This function performs AVL tree rebalancing by checking and correcting height imbalances
20
+ * between left and right subtrees. It handles:
21
+ * - Left-left case (single right rotation)
22
+ * - Left-right case (double rotation: left then right)
23
+ * - Right-right case (single left rotation)
24
+ * - Right-left case (double rotation: right then left)
25
+ */
13
26
static void lwp_avl_rebalance (struct lwp_avl_struct * * * nodeplaces_ptr , int count )
14
27
{
15
28
for (; count > 0 ; count -- )
@@ -76,6 +89,18 @@ static void lwp_avl_rebalance(struct lwp_avl_struct ***nodeplaces_ptr, int count
76
89
}
77
90
}
78
91
92
+ /**
93
+ * @brief Removes a node from an AVL tree while maintaining balance
94
+ *
95
+ * @param[in] node_to_delete The node to be removed from the AVL tree
96
+ * @param[in,out] ptree Pointer to the root node pointer of the AVL tree
97
+ *
98
+ * @note This function removes the specified node from the AVL tree and performs
99
+ * necessary rebalancing operations. It handles both cases where the node
100
+ * has no left child (simple removal) and where it has a left child (finding
101
+ * the rightmost node in the left subtree as replacement).
102
+ * It uses a stack to track the removal path for rebalancing.
103
+ */
79
104
void lwp_avl_remove (struct lwp_avl_struct * node_to_delete , struct lwp_avl_struct * * ptree )
80
105
{
81
106
avl_key_t key = node_to_delete -> avl_key ;
@@ -132,6 +157,14 @@ void lwp_avl_remove(struct lwp_avl_struct *node_to_delete, struct lwp_avl_struct
132
157
lwp_avl_rebalance (stack_ptr , stack_count );
133
158
}
134
159
160
+ /**
161
+ * @brief Inserts a new node into an AVL tree while maintaining balance
162
+ *
163
+ * @param[in] new_node The new node to be inserted into the AVL tree
164
+ * @param[in,out] ptree Pointer to the root node pointer of the AVL tree
165
+ *
166
+ * @note Uses a stack to track the insertion path for rebalancing
167
+ */
135
168
void lwp_avl_insert (struct lwp_avl_struct * new_node , struct lwp_avl_struct * * ptree )
136
169
{
137
170
avl_key_t key = new_node -> avl_key ;
@@ -158,6 +191,18 @@ void lwp_avl_insert(struct lwp_avl_struct *new_node, struct lwp_avl_struct **ptr
158
191
lwp_avl_rebalance (stack_ptr , stack_count );
159
192
}
160
193
194
+ /**
195
+ * @brief Finds a node in an AVL tree by key
196
+ *
197
+ * @param[in] key The key to search for in the AVL tree
198
+ * @param[in] ptree Pointer to the root node of the AVL tree
199
+ *
200
+ * @return struct lwp_avl_struct* Pointer to the found node, or NULL if not found
201
+ *
202
+ * @note This function searches the AVL tree for a node with the specified key.
203
+ * It performs a standard binary search by comparing keys and traversing
204
+ * left or right subtrees accordingly.
205
+ */
161
206
struct lwp_avl_struct * lwp_avl_find (avl_key_t key , struct lwp_avl_struct * ptree )
162
207
{
163
208
for (;;)
@@ -176,6 +221,19 @@ struct lwp_avl_struct *lwp_avl_find(avl_key_t key, struct lwp_avl_struct *ptree)
176
221
return ptree ;
177
222
}
178
223
224
+ /**
225
+ * @brief Recursively traverses an AVL tree and applies a function to each node
226
+ *
227
+ * @param[in] ptree Pointer to the root node of the AVL tree
228
+ * @param[in] fun Callback function to apply to each node
229
+ * @param[in,out] arg Additional argument passed to the callback function
230
+ *
231
+ * @return int Returns the last result from the callback function (0 if all nodes processed)
232
+ *
233
+ * @note This function performs an in-order traversal of the AVL tree, applying the
234
+ * provided callback function to each node. The traversal can be stopped early
235
+ * if the callback returns a non-zero value.
236
+ */
179
237
int lwp_avl_traversal (struct lwp_avl_struct * ptree , int (* fun )(struct lwp_avl_struct * , void * ), void * arg )
180
238
{
181
239
int ret ;
@@ -208,6 +266,16 @@ int lwp_avl_traversal(struct lwp_avl_struct *ptree, int (*fun)(struct lwp_avl_st
208
266
return ret ;
209
267
}
210
268
269
+ /**
270
+ * @brief Finds the first (leftmost) node in an AVL tree
271
+ *
272
+ * @param[in] ptree Pointer to the root node of the AVL tree
273
+ *
274
+ * @return struct lwp_avl_struct* Pointer to the leftmost node, or NULL if tree is empty
275
+ *
276
+ * @note This function traverses the AVL tree to find the leftmost node, which represents
277
+ * the minimum element in the tree. It's commonly used for ordered traversal starting point.
278
+ */
211
279
rt_weak struct lwp_avl_struct * lwp_map_find_first (struct lwp_avl_struct * ptree )
212
280
{
213
281
if (ptree == AVL_EMPTY )
@@ -224,4 +292,3 @@ rt_weak struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree)
224
292
}
225
293
return ptree ;
226
294
}
227
-
0 commit comments