AVL树的插入删除查找算法实现和分析-1(平衡因子法)

本文介绍了AVL树的插入、删除和查找算法的实现,重点讨论了使用平衡因子(左子树高度减右子树高度)的方法。尽管这种方法在时间复杂度上为O(log2N),但因需要大量判断和switch语句,导致程序复杂,不易维护。文章提到了两个主要复杂性来源,并建议采用记录树高度的方式来简化程序。作者计划在后续文章中提供改进的算法实现。
摘要由CSDN通过智能技术生成

至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法。


因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和右子树的高度差,而没有使用记录树的高度的方法。

代码如下:

#define FALSE 0
#define TRUE 1
#define LH 1
#define EH 0
#define RH -1

typedef struct AVLNode
{
    DataType cData;
    int nBf;        //结点的平衡因子,-1表示右子树的深度比左子树高1
                    //0表示左子树与右子树深度相等
                    //1表示左子树的深度比右子树高1
    struct AVLNode *LChild;
    struct AVLNode *RChild;
}AVLNode,*AVLTree;

typedef int BOOL;

void R_Rotate(AVLTree *pAT)
{
    //对以*pAT为根的二叉树作右旋转处理,处理之后pAT指向新的树根结点
    //即旋转处理之前的左子树的根结点
    AVLTree lc = (*pAT)->LChild;
    (*pAT)->LChild = lc->RChild;
    lc->RChild = *pAT;
    *pAT = lc;
}

void L_Rotate(AVLTree *pAT)
{
    //对以*pAT为根的二叉树作左旋转处理,处理之后pAT指向新的树根结点
    //即旋转处理之前的右子树的根结点
    AVLTree rc = (*pAT)->RChild;
    (*pAT)->RChild = rc->LChild;
    rc->LChild = *pAT;
    *pAT = rc;
}

void LeftBalance(AVLTree *pAT)
{
    //对以指针pAT所指结点为根的二叉树作左平衡旋转处理,
    //本算法结束时指针pAT指向新的结点
    AVLTree lc = (*pAT)->LChild;    //lc指向*pAT的左子树根结点
    AVLTree rd = NULL;
    if(lc)
    switch(lc->nBf)     //检查*pAT的左子树的平衡度,并作相应平衡处理
    {
        case LH:    //新结点插入在*pAT的左孩子的左子树上,要作单右旋转处理
            (*pAT)->nBf = lc->nBf = EH;
            R_Rotate(pAT);
            break;
        case RH:    //新结点插入在*pAT的左孩子的右子树上,要作双旋转处理
            rd = lc->RChild;
            switch(rd->nBf) //修改*pAT及其左孩子的平衡因子
            {
                case LH:
                    (*pAT)->nBf = RH;
                    lc->nBf = EH;
                    break;
                case EH:
                    (*pAT)->nBf = lc->nBf = EH;
                    brea
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值