【算法模板】AVL樹建樹模板(沒有刪除操作)

 好不容易整理吸收了自己寫的習慣 的AVL樹建樹模板,保存一下~


struct Node
{
    int value;
    Node *left,*right;
    Node(int v)
    {
        value=v;
        left=right=NULL;
    }
}*root=NULL;

//左旋和右旋的靈魂就是——新王交接,父承子業
//轉一次的root,就是舊王,新王是他兒子
//轉兩次的root,他的兒子是轉第一次的舊王,root自己是轉第二次的舊王
//ll中左子無敵,rr中右子無敵
//lr中左子必死;rl中右子必死


Node* ll(Node *root)//插在左子樹左邊,是右旋——root是舊王,左子新王
{
    Node *son=root->left;//造反的新王
    root->left=son->right;//舊王貶官,交接
    son->right=root;//新王摸狗頭
    return son;//返回新王
}
Node* rr(Node *root)//插在右子樹右邊,是左旋——root是舊王,右子新王
{
    //同上噢
    Node *son=root->right;
    root->right=son->left;
    son->left=root;
    return son;
}

//插在左子樹的右邊,是先左旋再右旋
//則root爲舊王,但是root的左子卻是左旋的舊王
Node* lr(Node *root)
{
    root->left=rr(root->left);//先左旋
    return ll(root);//再右旋

}

//插在右子樹的左邊,是先右旋再左旋
//則root爲舊王,但是root的右子卻是右旋的舊王
Node *rl(Node *root)
{
    root->right=ll(root->right);
    return rr(root);
}

//1、因爲AVL樹在插入過程中會進行旋轉,
//所以對於任何root而言,其左右子樹都可能發生旋轉,並使得root的左右孩子更改
//所以要左右孩子要保持迭代更新
//2、旋轉過程中,判斷是否發生旋轉,就是在高度差爲2的root和root的孩子上,要求高
//綜上所述要按照遞歸寫法
int getH(Node *root)//得到節點高
{
    if(!root)return 0;
    int l=getH(root->left);
    int r=getH(root->right);
    return max(l,r)+1;
}
Node* insert(Node *root,int value)
{
    if(!root)root=new Node(value);
    else if(value<root->value)//左邊
    {
        root->left=insert(root->left,value);//防止孩子旋轉,物是人非
        if(getH(root->left)-getH(root->right)==2)//因爲插在左子樹,所以要旋轉也是左子樹變長了
        {
            if(value<root->left->value)//在左子樹的左子樹上,是ll
                root=ll(root);//新的王
            else
                root=lr(root);
        }

    }
    else //右邊
    {
        root->right=insert(root->right,value);//防止孩子旋轉,物是人非
        if(getH(root->right)-getH(root->left)==2)//因爲插在右子樹,所以要旋轉也是右子樹變長了
        {
            if(value>root->right->value)//在右子樹的右子樹上,是rr
                root=rr(root);//新的王
            else
                root=rl(root);
        }

    }
    return root;
}

void main()
{
    int j;
    cin>>n;
    loop(i,0,n)root=insert(root,j);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章