二叉平衡树的创建

二叉树在创建过程中会遇到4中情况需要调整转换为二叉平衡树

clipboard.png

对图1来说需要进行一次旋转,下面说明代码实现的方式

转换结果

clipboard.png

开始

clipboard.png

交换q指针和p指针的data值

clipboard.png

右旋代码

    q->left = p->left;
    p->left = p->right;

    p->right = q->right;
    q->right = p;

分别为下面4个变换步骤

clipboard.png

clipboard.png

clipboard.png

clipboard.png

左旋只需要改变其中的left和right即可

对下图来说需要两次旋转

clipboard.png

第一次旋转,进行左旋

clipboard.png

clipboard.png

带入上述左旋中进行旋转,得到左图下面结果,在带入右旋中即可得到最终结果

clipboard.png

下面给出完整旋转代码

        while (1)
        {
            lstatus = 0;
            rstatus = 0;
            if (p->weight < -1)
            {    
                q = p;
                lstatus = 1;
                p = p->right;                
            }

            if (p->weight > 1)
            {
                q = p;
                rstatus = 1;
                p = p->left;
            }
            if (!lstatus && !rstatus)
                break;
        }

找到p,q

void turn_left(Node *&p, Node *&q)
{
    Node *r;
    

    int temp;

    temp = q->data;
    q->data = p->data;
    p->data = temp;

    q->right = p->right;
    p->right = p->left;

    p->left = q->left;
    q->left = p;

    q->weight = 0;
    if (p->right && p->left)
        p->weight = 0;
    if (!p->right && !p->left)
        p->weight = 0;
    if (p->right && !p->left)
        p->weight = -1;
    if (!p->right && p->left)
        p->weight = 1;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值