二叉排序树的左旋与右旋

/*
      ||                            ||
     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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值