My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
rbtree_remove.c
Go to the documentation of this file.
1 #include <3ds/util/rbtree.h>
2 #include "rbtree_internal.h"
3 
4 static void
5 recolor(rbtree_t *tree,
6  rbtree_node_t *parent,
8 {
9  rbtree_node_t *sibling;
10 
11  while(is_black(node) && node != tree->root)
12  {
13  int left = (node == parent->child[LEFT]);
14 
15  sibling = parent->child[left];
16 
17  if(is_red(sibling))
18  {
19  set_black(sibling);
20  set_red(parent);
21  rbtree_rotate(tree, parent, left);
22  sibling = parent->child[left];
23  }
24 
25  if(is_black(sibling->child[LEFT]) && is_black(sibling->child[RIGHT]))
26  {
27  set_red(sibling);
28  node = parent;
29  parent = get_parent(node);
30  }
31  else
32  {
33  if(is_black(sibling->child[left]))
34  {
35  set_black(sibling->child[!left]);
36  set_red(sibling);
37  rbtree_rotate(tree, sibling, !left);
38  sibling = parent->child[left];
39  }
40 
41  if(is_black(parent))
42  set_black(sibling);
43  else
44  set_red(sibling);
45  set_black(parent);
46  set_black(sibling->child[left]);
47 
48  rbtree_rotate(tree, parent, left);
49 
50  node = tree->root;
51  }
52  }
53 
54  if(node != NULL)
55  set_black(node);
56 }
57 
60  rbtree_node_t *node,
61  rbtree_node_destructor_t destructor)
62 {
63  rbtree_color_t color;
64  rbtree_node_t *child, *parent, *original = node;
65  rbtree_node_t *next;
66 
67  next = rbtree_node_next(node);
68 
69  if(node->child[LEFT] != NULL && node->child[RIGHT] != NULL)
70  {
71  rbtree_node_t *old = node;
72 
73  node = node->child[RIGHT];
74  while(node->child[LEFT] != NULL)
75  node = node->child[LEFT];
76 
77  parent = get_parent(old);
78  if(parent != NULL)
79  {
80  if(parent->child[LEFT] == old)
81  parent->child[LEFT] = node;
82  else
83  parent->child[RIGHT] = node;
84  }
85  else
86  tree->root = node;
87 
88  child = node->child[RIGHT];
89  parent = get_parent(node);
90  color = get_color(node);
91 
92  if(parent == old)
93  parent = node;
94  else
95  {
96  if(child != NULL)
97  set_parent(child, parent);
98  parent->child[LEFT] = child;
99 
100  node->child[RIGHT] = old->child[RIGHT];
101  set_parent(old->child[RIGHT], node);
102  }
103 
104  node->parent_color = old->parent_color;
105  node->child[LEFT] = old->child[LEFT];
106  set_parent(old->child[LEFT], node);
107  }
108  else
109  {
110  if(node->child[LEFT] == NULL)
111  child = node->child[RIGHT];
112  else
113  child = node->child[LEFT];
114 
115  parent = get_parent(node);
116  color = get_color(node);
117 
118  if(child != NULL)
119  set_parent(child, parent);
120  if(parent != NULL)
121  {
122  if(parent->child[LEFT] == node)
123  parent->child[LEFT] = child;
124  else
125  parent->child[RIGHT] = child;
126  }
127  else
128  tree->root = child;
129  }
130 
131  if(color == BLACK)
132  recolor(tree, parent, child);
133 
134  if(destructor != NULL)
135  (*destructor)(original);
136 
137  tree->size -= 1;
138 
139  return next;
140 }
rbtree_node_t * node
Definition: rbtree.h:45
#define RIGHT
size_t size
Definition: rbtree.h:25
rbtree_node_t * rbtree_node_next(const rbtree_node_t *node)
void rbtree_rotate(rbtree_t *tree, rbtree_node_t *node, int left)
Definition: rbtree_rotate.c:5
uintptr_t parent_color
Definition: rbtree.h:17
Definition: rbtree.h:21
enum rbtree_color rbtree_color_t
rbtree_node_t * rbtree_remove(rbtree_t *tree, rbtree_node_t *node, rbtree_node_destructor_t destructor)
Definition: rbtree_remove.c:59
void(* rbtree_node_destructor_t)(rbtree_node_t *Node)
Definition: rbtree.h:12
#define LEFT
rbtree_node_t * root
Definition: rbtree.h:23
rbtree_node_t * child[2]
Definition: rbtree.h:18