二叉平衡树的创建

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

二叉平衡树的创建_第1张图片

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

转换结果

二叉平衡树的创建_第2张图片

开始

二叉平衡树的创建_第3张图片

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

二叉平衡树的创建_第4张图片

右旋代码

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

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

分别为下面4个变换步骤

二叉平衡树的创建_第5张图片

二叉平衡树的创建_第6张图片

二叉平衡树的创建_第7张图片

二叉平衡树的创建_第8张图片

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

对下图来说需要两次旋转

二叉平衡树的创建_第9张图片

第一次旋转,进行左旋

二叉平衡树的创建_第10张图片

二叉平衡树的创建_第11张图片

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

二叉平衡树的创建_第12张图片

下面给出完整旋转代码

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


你可能感兴趣的:(二叉平衡树的创建)