/*
|| ||
node left
// \ 对node右旋 / \\
left right ll node
/ \\ // \
ll lr lr right
*/
static void right_rotation(struct RBNode *node, RBTree *ptree)
{
struct RBNode *left = node->lchild;
left->parent = node->parent;
if(node->parent != NULL) //node结点不是根结点 存在父结点
{
if(node == node->parent->lchild) //node是左孩子 left也应该作为左孩子
node->parent->lchild = left;
else
node->parent->rchild = left;
}
else //node是根结点 旋转之后left作为根结点
{
*ptree = left;
}
node->lchild = left->rchild;
if(left->rchild != NULL)
left->rchild->parent = node;
left->rchild = node;
node->parent = left;
}
/*
|| |
node right
/ \\ 对node左旋 / \
left right node rr
// \ / \
rl rr left rl
*/
static void left_rotation(struct RBNode *node, RBTree *ptree)
{
struct RBNode *right = node->rchild;
right->parent = node->parent;
if(node->parent != NULL)
{
if(node == node->parent->lchild)
node->parent->lchild = right;
else
node->parent->rchild = right;
}
else
{
*ptree = right;
}
node->rchild = right->lchild;
if(right->lchild != NULL)
right->lchild->parent = node;
right->lchild = node;
node->parent = right;
}
二叉排序树的左旋与右旋
最新推荐文章于 2023-01-09 12:38:57 发布