Skip to content

Commit abca47e

Browse files
committed
add red-black tree destructor
1 parent 4574bf2 commit abca47e

File tree

3 files changed

+139
-139
lines changed

3 files changed

+139
-139
lines changed

include/dos_tree.h

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -35,28 +35,16 @@ namespace alg
3535
/**
3636
* dynamic order stat node structure definition
3737
*/
38-
typedef struct dostree_node_t {
38+
typedef struct dostree_node_t : public rbtree_node_t {
3939
int key;// the key
4040
int size;// the size of this subtree
41-
struct rbtree_node_t node;// also, it's a red-black tree node.
4241
} *dostree_node;
4342

44-
#define DOSNODE(rbnode) \
45-
((dostree_node)((char *)rbnode - (unsigned long)(&((dostree_node)0)->node)))
46-
47-
#define DOSNODE_SIZE(rbnode) \
48-
(rbnode?DOSNODE(rbnode)->size:0)
43+
#define DOSNODE(rbnode) static_cast<dostree_node>(rbnode)
44+
#define DOSNODE_SIZE(rbnode) (rbnode?DOSNODE(rbnode)->size:0)
4945

5046
public:
51-
DosTree()
52-
{
53-
cb_left = cb_right = fix_rotation;
54-
}
55-
56-
~DosTree()
57-
{
58-
// TODO: delete nodes..
59-
}
47+
DosTree() { }
6048
private:
6149
DosTree(const DosTree&);
6250
DosTree& operator=(const DosTree&);
@@ -77,51 +65,49 @@ namespace alg
7765
rbtree_node n = root;
7866

7967
if (root == NULL) {
80-
root = &inserted_node->node;
68+
root = inserted_node;
8169
}
8270
else {
8371
while (1) {
8472
// incr 1 for each node on the path traversed from the root
8573
DOSNODE(n)->size+=1;
8674
if (key < DOSNODE(n)->key) {
8775
if (n->left == NULL) {
88-
n->left = &inserted_node->node;
76+
n->left = inserted_node;
8977
break;
9078
} else {
9179
n = n->left;
9280
}
9381
} else {
9482
if (n->right == NULL) {
95-
n->right = &inserted_node->node;
83+
n->right = inserted_node;
9684
break;
9785
} else {
9886
n = n->right;
9987
}
10088
}
10189
}
102-
inserted_node->node.parent = n;
90+
inserted_node->parent = n;
10391
}
10492

10593
// fix red-black properties
106-
insert_case1(&inserted_node->node);
94+
insert_case1(inserted_node);
10795
}
10896

10997
/**
11098
* delete the key in the red-black tree
11199
*/
112-
void delete_key(dostree_node x)
100+
void delete_key(dostree_node n)
113101
{
114102
rbtree_node child;
115-
if (x == NULL) return;
116-
rbtree_node n = &x->node;
117103

118104
// phase 1. fix up size
119105
fixup_size(n);
120106

121107
// phase 2. handle red-black properties, and deletion work.
122108
if (n->left != NULL && n->right != NULL) {
123109
/* Copy key/value from predecessor and then delete it instead */
124-
rbtree_node pred = maximum_node(n->left);
110+
dostree_node pred = DOSNODE(maximum_node(n->left));
125111
DOSNODE(n)->key = DOSNODE(pred)->key;
126112
DOSNODE(n)->size = DOSNODE(pred)->size;
127113
n = pred;
@@ -182,11 +168,16 @@ namespace alg
182168
/**
183169
* left/right rotation call back function
184170
*/
185-
static void fix_rotation(rbtree_node n, rbtree_node parent)
171+
void rotate_left_callback(rbtree_node n, rbtree_node parent)
186172
{
187173
DOSNODE(parent)->size = DOSNODE_SIZE(n);
188174
DOSNODE(n)->size = DOSNODE_SIZE(n->left) + DOSNODE_SIZE(n->right) + 1;
189175
}
176+
177+
void rotate_right_callback(rbtree_node n, rbtree_node parent)
178+
{
179+
rotate_left_callback(n,parent);
180+
}
190181

191182
/**
192183
* fix procedure caused by deletion
@@ -207,12 +198,12 @@ namespace alg
207198
dostree_node result =new dostree_node_t;
208199
result->key = key;
209200
result->size = 1;
210-
result->node.color = rbtree_node_color;
211-
result->node.left = NULL;
212-
result->node.right = NULL;
213-
if(left !=NULL) left->parent = &result->node;
214-
if(right!=NULL) right->parent = &result->node;
215-
result->node.parent = NULL;
201+
result->color = rbtree_node_color;
202+
result->left = NULL;
203+
result->right = NULL;
204+
if(left !=NULL) left->parent = result;
205+
if(right!=NULL) right->parent = result;
206+
result->parent = NULL;
216207
return result;
217208
}
218209

include/interval_tree.h

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,22 @@ namespace alg
3535
/**
3636
* Interval-Tree node definition
3737
*/
38-
typedef struct ivltree_node_t{
38+
typedef struct ivltree_node_t : public rbtree_node_t {
3939
int low;// lower-bound
4040
int high;// higher-bound
4141
int m;// max subtree upper bound value
42-
rbtree_node_t node;// red-black tree structure
4342
} * ivltree_node;
4443

45-
#define IVLNODE(rbnode) \
46-
((ivltree_node)((char *)rbnode - (unsigned long)(&((ivltree_node)0)->node)))
47-
48-
#define IVLNODE_M(rbnode) \
49-
(rbnode?IVLNODE(rbnode)->m:INT_MIN)
44+
#define IVLNODE(rbnode) static_cast<ivltree_node>(rbnode)
45+
#define IVLNODE_M(rbnode) (rbnode?IVLNODE(rbnode)->m:INT_MIN)
5046

5147
public:
5248
/**
5349
* ivltree_create
5450
* initialized an interval tree
5551
* same as init an red-black tree
5652
*/
57-
IntervalTree()
58-
{
59-
cb_left = cb_right = fix_rotation;
60-
}
53+
IntervalTree() { }
6154

6255
/**
6356
* ivltree_lookup
@@ -69,13 +62,13 @@ namespace alg
6962
*/
7063
ivltree_node lookup(int low, int high)
7164
{
72-
rbtree_node n = root;
73-
while (n != NULL && (low > IVLNODE(n)->high || IVLNODE(n)->low > high)) { // should search in childs
74-
if (n->left !=NULL && low <=IVLNODE(n->left)->m) n = n->left; // path choice on m.
75-
else n = n->right;
65+
ivltree_node n = IVLNODE(root);
66+
while (n != NULL && (low > n->high || n->low > high)) { // should search in childs
67+
if (n->left !=NULL && low <=IVLNODE(n->left)->m) n = IVLNODE(n->left); // path choice on m.
68+
else n = IVLNODE(n->right);
7669
}
7770

78-
return n==NULL?NULL:IVLNODE(n); // beware of the NULL pointer
71+
return n;
7972
}
8073

8174
/**
@@ -86,55 +79,54 @@ namespace alg
8679
{
8780
ivltree_node inserted_node = new_node(low, high, RED, NULL, NULL);
8881
if (root == NULL) {
89-
root = &inserted_node->node;
82+
root = inserted_node;
9083
} else {
91-
rbtree_node n = root;
84+
ivltree_node n = IVLNODE(root);
9285
while (1) {
9386
// update 'm' for each node traversed from root
94-
if (inserted_node->m > IVLNODE(n)->m) {
95-
IVLNODE(n)->m = inserted_node->m;
87+
if (inserted_node->m > n->m) {
88+
n->m = inserted_node->m;
9689
}
9790

9891
// find a proper position
99-
if (low < IVLNODE(n)->low) {
92+
if (low < n->low) {
10093
if (n->left == NULL) {
101-
n->left = &inserted_node->node;
94+
n->left = inserted_node;
10295
break;
10396
} else {
104-
n = n->left;
97+
n = IVLNODE(n->left);
10598
}
10699
} else {
107100
if (n->right == NULL) {
108-
n->right = &inserted_node->node;
101+
n->right = inserted_node;
109102
break;
110103
} else {
111-
n = n->right;
104+
n = IVLNODE(n->right);
112105
}
113106
}
114107
}
115-
inserted_node->node.parent = n;
108+
inserted_node->parent = n;
116109
}
117-
insert_case1(&inserted_node->node);
110+
insert_case1(inserted_node);
118111
}
119112

120113
/**
121114
* delete the key in the red-black tree
122115
*/
123-
void delete_key(ivltree_node x)
116+
void delete_key(ivltree_node n)
124117
{
125118
rbtree_node child;
126-
if (x == NULL) return;
127-
rbtree_node n = &x->node;
119+
if (n == NULL) return;
128120

129121
// phase 1. fixup the 'm' value until m is not the max value of the path.
130122
fixup_m(n);
131123

132124
// phase 2. red black tree deletion
133125
if (n->left != NULL && n->right != NULL) {
134126
/* Copy key/value from predecessor and then delete it instead */
135-
rbtree_node pred = maximum_node(n->left);
136-
IVLNODE(n)->low = IVLNODE(pred)->low;
137-
IVLNODE(n)->high= IVLNODE(pred)->high;
127+
ivltree_node pred = IVLNODE(maximum_node(n->left));
128+
n->low = pred->low;
129+
n->high= pred->high;
138130
n = pred;
139131
}
140132

@@ -148,15 +140,15 @@ namespace alg
148140
if (n->parent == NULL && child != NULL)
149141
child->color = BLACK;
150142

151-
delete(IVLNODE(n));
143+
delete(n);
152144
}
153145

154146
void print() {
155-
print_helper(root, 0);
147+
print_helper(IVLNODE(root), 0);
156148
puts("");
157149
}
158150

159-
void print_helper(rbtree_node n, int indent) {
151+
void print_helper(ivltree_node n, int indent) {
160152
int i;
161153

162154
if (n == NULL) {
@@ -165,16 +157,16 @@ namespace alg
165157
}
166158

167159
if (n->right != NULL) {
168-
print_helper(n->right, indent + INDENT_STEP);
160+
print_helper(IVLNODE(n->right), indent + INDENT_STEP);
169161
}
170162
for(i=0; i<indent; i++)
171163
fputs(" ", stdout);
172164
if (n->color == BLACK)
173-
printf("[%d %d, m->%d]\n", IVLNODE(n)->low,IVLNODE(n)->high,IVLNODE(n)->m);
165+
printf("[%d %d, m->%d]\n", n->low,n->high,n->m);
174166
else
175-
printf("*[%d %d, m->%d]\n", IVLNODE(n)->low, IVLNODE(n)->high,IVLNODE(n)->m);
167+
printf("*[%d %d, m->%d]\n", n->low, n->high,n->m);
176168
if (n->left != NULL) {
177-
print_helper(n->left, indent + INDENT_STEP);
169+
print_helper(IVLNODE(n->left), indent + INDENT_STEP);
178170
}
179171
}
180172

@@ -183,14 +175,17 @@ namespace alg
183175
/**
184176
* fix 'm' value caused by rotation
185177
*/
186-
static void fix_rotation(rbtree_node n, rbtree_node parent)
178+
void rotate_left_callback(rbtree_node n, rbtree_node parent)
187179
{
188180
// parent inherit max m value
189181
IVLNODE(parent)->m = IVLNODE(n)->m;
190-
191182
// update node 'm' value by it's children.
192-
IVLNODE(n)->m =
193-
Max(IVLNODE(n)->high, Max(IVLNODE_M(n->left), IVLNODE_M(n->right)));
183+
IVLNODE(n)->m = Max(IVLNODE(n)->high, Max(IVLNODE_M(n->left), IVLNODE_M(n->right)));
184+
}
185+
186+
void rotate_right_callback(rbtree_node n, rbtree_node parent)
187+
{
188+
rotate_left_callback(n, parent);
194189
}
195190

196191
/**
@@ -229,12 +224,12 @@ namespace alg
229224
result->low = low;
230225
result->high = high;
231226
result->m = high;
232-
result->node.color = rbtree_node_color;
233-
result->node.left = left;
234-
result->node.right = right;
235-
if(left !=NULL) left->parent = &result->node;
236-
if(right!=NULL) right->parent = &result->node;
237-
result->node.parent = NULL;
227+
result->color = rbtree_node_color;
228+
result->left = left;
229+
result->right = right;
230+
if(left !=NULL) left->parent = result;
231+
if(right!=NULL) right->parent = result;
232+
result->parent = NULL;
238233
return result;
239234
}
240235
};

0 commit comments

Comments
 (0)