Skip to content

Commit a6f8b06

Browse files
committed
Optimized max and min lookup
1 parent 001262e commit a6f8b06

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

ext/containers/rbtree_map/rbtree.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,17 +176,17 @@ static VALUE get(rbtree *tree, rbtree_node *node, VALUE key) {
176176
}
177177

178178
static VALUE min_key(rbtree_node *node) {
179-
if (!node->left)
180-
return node->key;
179+
while (node->left)
180+
node = node->left;
181181

182-
return min_key(node->left);
182+
return node->key;
183183
}
184184

185185
static VALUE max_key(rbtree_node *node) {
186-
if (!node->right)
187-
return node->key;
186+
while (node->right)
187+
node = node->right;
188188

189-
return max_key(node->right);
189+
return node->key;
190190
}
191191

192192
static rbtree_node* delete_min(rbtree_node *h, VALUE *deleted_value) {

ext/containers/splaytree_map/splaytree.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,6 @@ static VALUE get(splaytree *tree, VALUE key) {
154154
return Qnil;
155155
}
156156

157-
static VALUE min_key(splaytree_node *node) {
158-
if (!node->left)
159-
return node->key;
160-
161-
return min_key(node->left);
162-
}
163-
164-
static VALUE max_key(splaytree_node *node) {
165-
if (!node->right)
166-
return node->key;
167-
168-
return max_key(node->right);
169-
}
170-
171157
static VALUE delete(splaytree *tree, VALUE key) {
172158
int cmp;
173159
splaytree_node *x, *deleted_root;
@@ -304,18 +290,30 @@ static VALUE splaytree_has_key(VALUE self, VALUE key) {
304290

305291
static VALUE splaytree_min_key(VALUE self) {
306292
splaytree *tree = get_tree_from_self(self);
293+
splaytree_node *node;
294+
307295
if(!tree->root)
308296
return Qnil;
309297

310-
return min_key(tree->root);
298+
node = tree->root;
299+
while (node->left)
300+
node = node->left;
301+
302+
return node->key;
311303
}
312304

313305
static VALUE splaytree_max_key(VALUE self) {
314306
splaytree *tree = get_tree_from_self(self);
307+
splaytree_node *node;
308+
315309
if(!tree->root)
316310
return Qnil;
317311

318-
return max_key(tree->root);
312+
node = tree->root;
313+
while (node->right)
314+
node = node->right;
315+
316+
return node->key;
319317
}
320318

321319
static VALUE splaytree_delete(VALUE self, VALUE key) {

0 commit comments

Comments
 (0)