二叉树在创建过程中会遇到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;
}



吴闯
30 声望5 粉丝