平衡二叉树-旋转

旋转分为左旋转与右旋转,左右旋转与右左旋转
我都在图片里表示:
这里写图片描述

//右旋转,这里传入的为图中的b点

    {
        Node *grandfather = father->_father;
        Node *great_father = grandfather->_father;

        grandfather->_left = father->_right;
        if (father->_right != NULL)
            father->_right->_father = grandfather;

        father->_right = grandfather;
        grandfather->_father = father;
        //判段是否为头结点,事实上这里的头节点会被修改,你应该传入         
        //  root引用来修改root
        if (NULL != great_father)
        {
            if (great_father->_left == grandfather)
                great_father->_left = father;
            else great_father->_right = father;
        }
        father->_father = great_father;
    }

这里写图片描述
//father为图中b点
void rotate_left(Node *father)
{
Node *grandfather = father->_father;
Node *great_father = grandfather->_father;

    grandfather->_right = father->_left;
    if (father->_left != NULL)
        father->_left->_father = grandfather;

    father->_left = grandfather;
    grandfather->_father = father;
    //判段是否为头结点,事实上这里的头节点会被修改,你应该传入         
    //  root引用来修改root
    if (NULL != great_father)
    {
        if (great_father->_left == grandfather)
            great_father->_left = father;
        else great_father->_right = father;

    }
    father->_father = great_father;

}

这里写图片描述

//先对b,c进行左旋,在对c,a进行右旋
    void rotate_left_right(Node *father)
    {
        father = father->_right;
        rotate_left(father);
        rotate_right(father);
    }

这里写图片描述

//与左右旋转同理
void rotate_right_left(Node *father)
    {
        father = father->_left;
        rotate_right(father);
        rotate_left(father);
    }

**特别补充:**A, B, C, D四个点也可能表示子树。
这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值