]> granicus.if.org Git - sudo/commitdiff
In rbrepair, re-color the root or the first non-block node we find to
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 29 Jun 2009 13:36:20 +0000 (13:36 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 29 Jun 2009 13:36:20 +0000 (13:36 +0000)
be black.  Re-coloring the root is probably not needed but won't hurt.

redblack.c

index 44875f7880979ffc0836b2491bdd63a75543dd76..5f343265beda3d80750815685b2031bdb355faab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2005, 2007 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2004-2005, 2007,2009 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -77,10 +77,11 @@ static void _rbdestroy              __P((struct rbtree *, struct rbnode *,
  * In addition to the ordinary requirements imposed on binary search
  * trees, we make the following additional requirements of any valid
  * red-black tree:
- *  1) The root is black.
- *  2) All leaves are black.
- *  3) Both children of each red node are black.
- *  4) The paths from each leaf up to the root each contain the same
+ *  1) Every node is either red or black.
+ *  2) The root is black.
+ *  3) All leaves are black.
+ *  4) Both children of each red node are black.
+ *  5) The paths from each leaf up to the root each contain the same
  *     number of black nodes.
  */
 
@@ -372,8 +373,8 @@ rbdestroy(tree, destroy)
  * Delete node 'z' from the tree and return its data pointer.
  */
 void *rbdelete(tree, z)
-    struct rbtreetree;
-    struct rbnodez;
+    struct rbtree *tree;
+    struct rbnode *z;
 {
     struct rbnode *x, *y;
     void *data = z->data;
@@ -444,7 +445,7 @@ rbrepair(tree, node)
                node->parent->color = black;
                sibling->right->color = black;
                rotate_left(tree, node->parent);
-               break;
+               node = rbroot(tree); /* exit loop */
            }
        } else { /* if (node == node->parent->right) */
            sibling = node->parent->left;
@@ -468,8 +469,9 @@ rbrepair(tree, node)
                node->parent->color = black;
                sibling->left->color = black;
                rotate_right(tree, node->parent);
-               break;
+               node = rbroot(tree); /* exit loop */
            }
        }
     }
+    node->color = black;
 }