若为假,则始终设置根结点的颜色属性为黑色 。
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);}
推荐阅读
- 石楠树为什么有精子味,石楠花为什么污
- 桐树花的功效与作用泡,泡桐树有什么作用
- 云南白茶的功效,云南古树白茶的特点
- 椿树图片,香椿是什么样子图片
- 紫沙茶罐图片及价格,广西大红花油茶树挂果图片及视频大果红花油茶图片大全欣赏
- 石竹草图片,明月草(又名降糖草降糖树血米草简介及图片
- 红玉兰树,红玉兰树适合什么土壤生长
- 陈皮泡红茶好还是绿茶好,常喝红茶好还是绿茶好
- 类似忍冬,原神忍冬之树有什么作用
- 泡桐树花有什么作用,泡桐树有什么作用