AVL树的旋转分析与实现

AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它须保证树的深度是O(log N).**一棵AVL树是其每个节点的左子树和右子树的高度最多插1的二叉查找树**
基本的数据结构:
struct AvlNode;
typedef struct AvlNode *Position ;
typedef struct AvlNode *AvlTree;
struct AvlNode
{
    int Element;
    AvlTree Left;
    AvlTree Right;
    int height;
};
static int Height(Postion P)
{
    if(P==NULL)
    {
        return -1;
    }
    else
        return P->Height;
}
当进行插入操作时,我们需要更新通向根节点路径上那些节点的所有平衡信息,而插入操作隐含着困难的原因在于,插入一个节点可能破坏AVL树的特性。如果发生这种情况,那么就要把性质恢复以后才认为这一步插入完成。事实上,这总可以通过对树进行简单的修正来做到,我们称其为旋转。
平衡化旋转有两类:

单旋转:

左单旋转
左旋的代码实现:

static Position SingleRotateWithLeft(Postion K2)
{
    Position k1;
    k1=k2->Left;
    k2->left=k1->Right;
    k1->Right=k2;
    k2->Height=Max(Height(k2->Left),Height(k2->Right));
    k2->Height=Max(Height(k1->Left),Height(k2->Height));
    return k1;
}

这里写图片描述
右旋的代码实现:

static Position SingleRotateWithHeight(Postion K2)
{
    Position k1;
    k1=k2->Right;
    k1->Height=k2->Left;
    k2->Left=k1;
    k2->Height=Max(Height(k2->Left),Height(k2->Right));
    k2->Height=Max(Height(k1->Left),Height(k2->Height));
    return k2;
}

双旋转
这里写图片描述
先右后左双旋转代码实现:

static Position DoubleRotateWithLeft(Position k3)
{
    k3-Left=SingleRotateWithRight(k3->Left);//旋转k1和k2
    return SingleWithLeft(k3)//旋转k3和k2
}

这里写图片描述
先左后右双旋转代码实现

static Position DoubleRotateWithLeft(Position k3)
{
    k3->Right=SingleRotateWithLeft(k3->Right);//旋转k1和k2
    return SingleWithHeight(k3)//旋转k3和k2
}

向AVL树插入节点的函数实现:

AvlTree Insert(int X,AvlTree T)
{
    if(T==NULL)/*Create and return a one-node tree*/
    {
        T=malloc(sizeof(struct AvlNode));
        if(T==NULL)
        {
            printf("Out of space");
        }
        else
        {
            T->Element=X;
            T->Height=0;
            T->Left=T->Right=NULL;
        }


    }
    else if(X<Element)
    {
        T->Left=Insert(X,T->Left);
        if(Height(T->Left)-Height(T->Right)==2)
        {
            if(X<T->Left->Element)
            {
                T=SingleRotateWithLeft(T);
            }
            else
                T=DoubleRotateWithLeft(T);
        }
        else if(X>T->Element)
        {
            T->Right=Insert(X,T->Right);
            if(Height(T->Right)-Height(T->Left))
            {
                T=SingleRotateWithRight(T);
            }
            else
            {
                T=DoubleRotateWithRight(T);
            }
        }
        /*Else is in the tree already ,we will do nothing*/
        T->Height=Max(Height(T->Left),Height(T->Right))+1;




    }
}

参考资料:
1,《数据结构与算法分析c语言描述》。
2,http://www.cnblogs.com/skywang12345/p/3577360.html

胚胎实例分割数据集 一、基础信息 • 数据集名称:胚胎实例分割数据集 • 图片数量: 训练集:219张图片 验证集:49张图片 测试集:58张图片 总计:326张图片 • 训练集:219张图片 • 验证集:49张图片 • 测试集:58张图片 • 总计:326张图片 • 分类类别: 胚胎(embryo):表示生物胚胎结构,适用于发育生物学研究。 • 胚胎(embryo):表示生物胚胎结构,适用于发育生物学研究。 • 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。 • 数据格式:图片来源于相关研究领域,格式为常见图像格式,细节清晰。 二、适用场景 • 胚胎发育AI分析系统:构建能够自动分割胚胎实例的AI模型,用于生物学研究中的形态变化追踪和量化分析。 • 医学生物研究:在生殖医学、遗传学等领域,辅助研究人员进行胚胎结构识别、分割和发育阶段评估。 • 学术创新研究:支持计算机视觉生物医学的交叉学科研究,推动AI在胚胎学中的应用,助力高水平论文发表。 • 教育实践培训:用于高校或研究机构的实验教学,帮助学生和从业者掌握实例分割技术及胚胎学知识。 三、数据集优势 • 精准专业性:实例分割标注由领域专家完成,确保胚胎轮廓的精确性,提升模型训练的可靠性。 • 任务专用性:专注于胚胎实例分割,填补相关领域数据空白,适用于细粒度视觉分析。 • 格式兼容性:采用YOLO标注格式,易于集成到主流深度学习框架中,简化模型开发部署流程。 • 科学价值突出:为胚胎发育研究、生命科学创新提供关键数据资源,促进AI在生物学中的实际应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值