Rev 2450 | Rev 2496 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2450 | Rev 2461 | ||
|---|---|---|---|
| Line 35... | Line 35... | ||
| 35 | * @brief AVL tree implementation. |
35 | * @brief AVL tree implementation. |
| 36 | * |
36 | * |
| 37 | * This file implements AVL tree type and operations. |
37 | * This file implements AVL tree type and operations. |
| 38 | * |
38 | * |
| 39 | * Implemented AVL tree has the following properties: |
39 | * Implemented AVL tree has the following properties: |
| 40 | * @li it is binary search tree with non-unique keys |
40 | * @li It is binary search tree with non-unique keys. |
| 41 | * @li Difference of heights of left and right subtree of every node is max 1. |
41 | * @li Difference of heights of left and right subtree of every node is max 1. |
| 42 | * |
42 | * |
| 43 | * Every node has pointer to its parent which allows insertion of multiple identical keys |
43 | * Every node has pointer to its parent which allows insertion of multiple identical keys |
| 44 | * into tree. |
44 | * into tree. |
| 45 | * |
45 | * |
| Line 47... | Line 47... | ||
| 47 | * node key. There is no rule in which order nodes with the same key are visited. |
47 | * node key. There is no rule in which order nodes with the same key are visited. |
| 48 | */ |
48 | */ |
| 49 | 49 | ||
| 50 | #include <adt/avl.h> |
50 | #include <adt/avl.h> |
| 51 | #include <debug.h> |
51 | #include <debug.h> |
| 52 | #include <panic.h> |
- | |
| 53 | 52 | ||
| 54 | 53 | ||
| 55 | #define AVLTREE_LEFT 0 |
54 | #define AVLTREE_LEFT 0 |
| 56 | #define AVLTREE_RIGHT 1 |
55 | #define AVLTREE_RIGHT 1 |
| 57 | 56 | ||
| Line 129... | Line 128... | ||
| 129 | */ |
128 | */ |
| 130 | key = newnode->key + t->base; |
129 | key = newnode->key + t->base; |
| 131 | 130 | ||
| 132 | 131 | ||
| 133 | /* |
132 | /* |
| 134 | * Iteratively descend to the leaf that can will contain new node. |
133 | * Iteratively descend to the leaf that can contain new node. |
| 135 | * Last node with non-zero balance in the way to leaf is stored as top - |
134 | * Last node with non-zero balance in the way to leaf is stored as top - |
| 136 | * it si place of possible balance failure. |
135 | * it si place of possible balance fault. |
| 137 | */ |
136 | */ |
| 138 | dpc = &t->root; |
137 | dpc = &t->root; |
| 139 | gpa = NULL; |
138 | gpa = NULL; |
| 140 | top = t->root; |
139 | top = t->root; |
| 141 | while ((par = (*dpc)) != NULL) { |
140 | while ((par = (*dpc)) != NULL) { |
| Line 695... | Line 694... | ||
| 695 | * @param t AVL tree structure. |
694 | * @param t AVL tree structure. |
| 696 | */ |
695 | */ |
| 697 | bool avltree_delete_min(avltree_t *t) |
696 | bool avltree_delete_min(avltree_t *t) |
| 698 | { |
697 | { |
| 699 | avltree_node_t *node; |
698 | avltree_node_t *node; |
| 700 | uint64_t key; |
- | |
| 701 | 699 | ||
| 702 | /* |
700 | /* |
| 703 | * Start search of smallest key in tree in the root node and |
701 | * Start search of smallest key in tree in the root node and |
| 704 | * continue in cycle to the most left node in the tree which |
702 | * continue in cycle to the most left node in the tree which |
| 705 | * must have smallest key. |
703 | * must have smallest key. |
| Line 709... | Line 707... | ||
| 709 | 707 | ||
| 710 | while (node->lft != NULL) |
708 | while (node->lft != NULL) |
| 711 | node = node->lft; |
709 | node = node->lft; |
| 712 | 710 | ||
| 713 | /* |
711 | /* |
| 714 | * Store key and use avltree_delete function to delete node from tree. |
712 | * Use avltree_delete function to delete node from tree. |
| 715 | */ |
713 | */ |
| 716 | key = node->key; |
- | |
| 717 | avltree_delete(t,node); |
714 | avltree_delete(t,node); |
| 718 | 715 | ||
| 719 | return true; |
716 | return true; |
| 720 | } |
717 | } |