二叉平衡树(AVL)的插入

这次节点的数据域增加了高度这个量,用来计算平衡因子,以此在插入的时候来调整树的结构
节点:

struct node
{
    int val;
    int hei;
    node *l;
    node *r;
};

构造新节点

node* newNode(int v)
{
    node* Node=new node;
    Node->val=v;
    Node->hei=1;
    Node->l=Node->r=NULL;
    return Node;
}

获取树高

int getHeight(node* root)
{
    if(root==NULL)
        return 0;
    return root->hei;
}

计算平衡因子:

int getBalanceFactor(node* root)
{
    return getHeight(root->l)-getHeight(root->r);
}

更新树高:

void updateHeight(node* root)
{
    root->hei=max(getHeight(root->l),getHeight(root->r))+1;
}

左旋操作:

void L(node* &root)
{
    node* temp=root->r;
    root->r=temp->l;
    temp->l=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp;
}

右旋操作(与左旋对称):

void R(node* &root)
{
    node* temp=root->l;
    root->l=temp->r;
    temp->r=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp; 
}

插入:

void insert(node* &root,int v)
{
    if(root==NULL)
    {
        root=newNode(v);
        return;
    }
    if(v<root->val)
    {
        insert(root->l,v);
        updateHeight(root);
        if(getBalanceFactor(root)==2)
            if(getBalanceFactor(root->l)==1)
                R(root);
            else
            {
                L(root->l);
                R(root);
            }   
    }
    else
    {
        insert(root->r,v);
        updateHeight(root);
        if(getBalanceFactor(root)==-2)
            if(getBalanceFactor(root->r)==-1)
                L(root);
            else
            {
                R(root->r);
                L(root);
            }
    }
}

关键小心左旋右旋和插入的细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值