chiark / gitweb /
added rb_tree_find_lt
authorstevenj <stevenj@alum.mit.edu>
Tue, 11 Sep 2007 22:43:07 +0000 (18:43 -0400)
committerstevenj <stevenj@alum.mit.edu>
Tue, 11 Sep 2007 22:43:07 +0000 (18:43 -0400)
darcs-hash:20070911224307-c8de0-cbaa8a1784b3d5cf99c76a95ee8abb10463648cc.gz

util/redblack.c
util/redblack.h

index 4fb4a4d586679729d55228952500dad39b9a1a2c..5ec2ffdf6133455296e215b963a25a8348d57cad 100644 (file)
@@ -211,6 +211,28 @@ rb_node *rb_tree_find_le(rb_tree *t, rb_key k)
      return find_le(t->root, k, t);
 }
 
+/* find greatest point in subtree p that is < k */
+static rb_node *find_lt(rb_node *p, rb_key k, rb_tree *t)
+{
+     rb_compare compare = t->compare;
+     while (p != NIL) {
+         if (compare(p->k, k) < 0) { /* p->k < k */
+              rb_node *r = find_lt(p->r, k, t);
+              if (r) return r;
+              else return p;
+         }
+         else /* p->k >= k */
+              p = p->l;
+     }
+     return NULL; /* k <= everything in subtree */
+}
+
+/* find greatest point in t < k */
+rb_node *rb_tree_find_lt(rb_tree *t, rb_key k)
+{
+     return find_lt(t->root, k, t);
+}
+
 /* find least point in subtree p that is > k */
 static rb_node *find_gt(rb_node *p, rb_key k, rb_tree *t)
 {
index d428d640a71104239eb7a139c17eb01b0bbd57ef..60fde3d0e8607fd377be355d4461a0b4a81c0e16 100644 (file)
@@ -34,6 +34,7 @@ extern rb_node *rb_tree_insert(rb_tree *t, rb_key k);
 extern int rb_tree_check(rb_tree *t);
 extern rb_node *rb_tree_find(rb_tree *t, rb_key k);
 extern rb_node *rb_tree_find_le(rb_tree *t, rb_key k);
+extern rb_node *rb_tree_find_lt(rb_tree *t, rb_key k);
 extern rb_node *rb_tree_find_gt(rb_tree *t, rb_key k);
 extern rb_node *rb_tree_resort(rb_tree *t, rb_node *n);
 extern rb_node *rb_tree_min(rb_tree *t);