1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| //T 表示为树根,x 表示需要进行左旋的子树的根结点 void rbTree_left_rotate( RBT_Root* T, RB_TREE* x) { RB_TREE* y = x->right;//找到根结点的右子树 x->right = y->left;//将右子树的左孩子移动至结点 x 的右孩子处 if(x->right != T->nil) { //如果 x 的右子树不是 nil,需重新连接 右子树的双亲结点为 x x->right->p = x; } y->p = x->p;//设置 y 的双亲结点为 x 的双亲结点 //重新设置 y 的双亲结点同 y 的连接,分为 2 种情况:1、原 x 结点本身就是整棵树的数根结点,此时只需要将 T 指针指向 y;2、根据 y 中 关键字同其父结点关键字的值的大小,判断 y 是父结点的左孩子还是右孩子 if(y->p == T->nil) { T->root = y; } else if(y->key < y->p->key) { y->p->left = y; } else { y->p->right = y; } y->left = x;//将 x 连接给 y 结点的左孩子处 x->p = y;//设置 x 的双亲结点为 y。 }
|