AVL树

AVL树是其每一个节点的左子树和右子树的高度差最多差1的二叉查找树。

///Avl树//
struct AvlNode;
typedef struct AvlNode* AvlTree;
typedef struct AvlNode* Position;

struct AvlNode{
    ElementType element;
    AvlTree left;
    AvlTree right;
    int height;  //存储高度信息
}

//返回高度信息
int get_height(Position P){
    if(P==NULL){
        return -1;
    }
    else{
        return P->height;
    }
}

//插入元素到AVL树的例程  重难点
AvlTree Insert(ElementType x,AvlTree T){
    if(T==NULL){
        AvlTree T=malloc(sizeof(struct AvlNode));
        T->element=x;
        T->left=NULL;
        T->right=NULL;
        T->height=0;
        //return T;
    }
    else if(x < T->element){
        T->left=Insert(x,T->left);
        //处理左平衡条件
        if((get_height(T->left)-get_height(T->right))==2 /* >1 */){
            if(x < T->left->element){  //左左
                T=SingleRorateWithLeft(T);
            }
            else{  //左右
                T=DoubleRotateWithLeft(T);
            }
        }   
    }
    else if(x > T->element){
        T->right=Insert(x,T->right);
        //同理,处理右平衡条件
        if((get_height(T->right) - get_height(T->left))==2){
            if(x > T->right->element){  //右右
                T=SingleRorateWithRight(T);
            }
            else{  //右左
                T=DoubleRotateWithRight(T);
            }
        }

    }
    else{
        //x is already exists,do nothing
    }

    //高度信息修改
    T->height=max(get_height(T->left),get_height(T->right))+1;
    return T;
}

//单旋转例程  左左
Position SingleRorateWithLeft(Position K2){
    //初始化
    Position K1;
    K1=K2->left;

    //旋转
    K2->left=K1->right;
    K1->right=K2;

    //更新高度信息
    K2->height=max(get_height(K2->left),get_height(K2->right))+1;
    K1->height=max(get_height(K1->left),get_height(K1->right)/*K2->height*/)+1;

    //返回新节点
    return K1;  
}

//右右
Position SingleRorateWithRight(Position K2){
    Position K1;
    K1=K2->right;

    K2->right=K1->left;
    K1->left=K2;

    K2->height=max(get_height(K2->left),get_height(K2->right))+1;
    K1->height=max(get_height(K1->left),get_height(K1->right))+1;

    return K1;
}

//双旋转例程 左右
Position DoubleRotateWithLeft(Position K3){

    K3->left=SingleRorateWithRight(K3->left);

    return SingleRorateWithLeft(K3);
}

//双旋转例程 右左
Position DoubleRotateWithRight(Position K3){

    K3->right=SingleRorateWithLeft(K3->right);

    return SingleRorateWithRight(K3);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值