红黑树底层原理及Linux内核红黑树算法深度研究( 四 )


若为假,则始终设置根结点的颜色属性为黑色 。
void rb_insert_color(struct rb_node *node, struct rb_root *root){    struct rb_node *parent, *gparent;     while ((parent = rb_parent(node)) && rb_is_red(parent)) //双亲结点不为NULL,且颜色属性为红色    {        gparent = rb_parent(parent); //获得祖父结点         if (parent == gparent->rb_left) //双亲结点是祖父结点左子树的根        {            {                register struct rb_node *uncle = gparent->rb_right; //获得叔父结点                if (uncle && rb_is_red(uncle)) //叔父结点存在,且颜色属性为红色                {                    rb_set_black(uncle); //设置叔父结点为黑色                    rb_set_black(parent); //设置双亲结点为黑色                    rb_set_red(gparent); //设置祖父结点为红色                    node = gparent;  //node指向祖父结点                     continue; //继续下一个while循环                }            }             if (parent->rb_right == node)  //当node是其双亲结点右子树的根时            {                register struct rb_node *tmp;                __rb_rotate_left(parent, root); //左旋                tmp = parent;  //调整parent和node指针的指向                parent = node;                node = tmp;            }             rb_set_black(parent); //设置双亲结点为黑色            rb_set_red(gparent); //设置祖父结点为红色            __rb_rotate_right(gparent, root); //右旋        } else { // !(parent == gparent->rb_left)            {                register struct rb_node *uncle = gparent->rb_left;                if (uncle && rb_is_red(uncle))                {                    rb_set_black(uncle);                    rb_set_black(parent);                    rb_set_red(gparent);                    node = gparent;                    continue;                }            }             if (parent->rb_left == node)            {                register struct rb_node *tmp;                __rb_rotate_right(parent, root);                tmp = parent;                parent = node;                node = tmp;            }             rb_set_black(parent);            rb_set_red(gparent);            __rb_rotate_left(gparent, root);        } //end if (parent == gparent->rb_left)    } //end while ((parent = rb_parent(node)) && rb_is_red(parent))     rb_set_black(root->rb_node);}


推荐阅读