@@ -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 {
3939int low;// lower-bound
4040int high;// higher-bound
4141int 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
5147public:
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 */
7063ivltree_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{
8780ivltree_node inserted_node = new_node (low, high, RED, NULL , NULL );
8881if (root == NULL ) {
89- root = & inserted_node-> node ;
82+ root = inserted_node;
9083} else {
91- rbtree_node n = root;
84+ ivltree_node n = IVLNODE ( root) ;
9285while (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 ) {
10093if (n->left == NULL ) {
101- n->left = & inserted_node-> node ;
94+ n->left = inserted_node;
10295break ;
10396} else {
104- n = n->left ;
97+ n = IVLNODE ( n->left ) ;
10598}
10699} else {
107100if (n->right == NULL ) {
108- n->right = & inserted_node-> node ;
101+ n->right = inserted_node;
109102break ;
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{
125118rbtree_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.
130122fixup_m (n);
131123
132124// phase 2. red black tree deletion
133125if (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 ;
138130n = pred;
139131}
140132
@@ -148,15 +140,15 @@ namespace alg
148140if (n->parent == NULL && child != NULL )
149141child->color = BLACK;
150142
151- delete (IVLNODE (n) );
143+ delete (n );
152144}
153145
154146void print () {
155- print_helper (root, 0 );
147+ print_helper (IVLNODE ( root) , 0 );
156148puts (" " );
157149}
158150
159- void print_helper (rbtree_node n, int indent) {
151+ void print_helper (ivltree_node n, int indent) {
160152int i;
161153
162154if (n == NULL ) {
@@ -165,16 +157,16 @@ namespace alg
165157}
166158
167159if (n->right != NULL ) {
168- print_helper (n->right , indent + INDENT_STEP);
160+ print_helper (IVLNODE ( n->right ) , indent + INDENT_STEP);
169161}
170162for (i=0 ; i<indent; i++)
171163fputs (" " , stdout);
172164if (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 );
174166else
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 );
176168if (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
189181IVLNODE (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
229224result->low = low;
230225result->high = high;
231226result->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 ;
238233return result;
239234}
240235};
0 commit comments