数据结构算法-AVL树

Java 数据结构与算法之树(AVL) AVL树历史在计算机科学中,AVL 树以其两位苏联发明家Georgy Adelson-Velsky和 Evgenii Landis的名字命名,他们在 1962 年的论文“信息组织算法”中发表了它。它是一种自平衡二叉搜索树(BST),这是发明的第一个这样的数据结构。 阅读详情

数据结构算法-AVL树

1. AVL树介绍

AVL树(Adelson-Velsky and Landis Tree)是一种自平衡的二叉搜索树,其特点主要包括平衡性和高效的查找、插入和删除操作。‌‌

平衡性
AVL树通过维护每个节点的平衡因子(左子树高度与右子树高度之差)来保持树的平衡。平衡因子的值只能是-1、0或1。如果某个节点的平衡因子绝对值大于1,那么该树就失去了平衡,需要通过旋转操作来重新平衡。

高效的查找、插入和删除操作
由于AVL树保持了平衡,其查找、插入和删除操作的时间复杂度都能保持在O(log n)的范围内,其中n是树中节点的数量。这使得AVL树在处理大量数据时能够保持高效的性能。

旋转操作
当AVL树失去平衡时,会触发旋转操作来恢复平衡。旋转操作主要有四种:右旋(单旋)、左旋(单旋)、右-左双旋和左-右双旋。这些旋转操作通过改变树中节点的链接关系来降低树的高度,从而保持树的平衡。

应用场景
AVL树广泛应用于需要频繁插入、删除和查找操作的场景,如数据库索引、文件系统的目录结构、实时数据更新等。在这些场景中,AVL树能够保持高效的性能,确保数据处理的快速响应。

2. 源码

public class AvlTree {

    private AVLNode root = null;


    public void put(int key, Object value) {
        this.root = this.doPut(root, key, value);
    }
    
    public void delete(int key) {
        this.root = doDelete(root, key);
    }

    private AVLNode doDelete(AVLNode node, int key) {
        if (node == null) {
            return null;
        }
        if (key < node.key) {
            node.left = doDelete(node.left, key);
        } else if (key > node.key) {
            node.right = doDelete(node.right, key);
        } else {
            // 找到了
            // 只有一个孩子
            if (node.left == null) {
                node = node.right;
            } else if (node.right == null) {
                node = node.left;
            } else {
                // 有两个孩子
                // 找到后继节点
                AVLNode s = node.right;
                while (s.left != null) {
                    s = s.left;
                }
                // 删除后继节点, 因为会失衡, 返回删除后的根节点
                s.right = this.doDelete(node.right, s.key);
                s.left = node.left;
                node = s;
            }
        }
        if (node == null) {
            return null;
        }
        updateHeight(node);
        return balance(node);
        
    }

    private AVLNode doPut(AVLNode node, int key, Object value) {
        if (node == null) {
            return new AVLNode(key, value);
        }
        if (key == node.key) {
            node.value = value;
            return node;
        }
        if (key < node.key) {
            node.left = doPut(node.left, key, value);
        } else {
            node.right = doPut(node.right, key, value);
        }
        // 更新高度
        updateHeight(node);
        // 平衡二叉树
        return balance(node);
    }

    private AVLNode balance(AVLNode node) {
        if (node == null) {
            return null;
        }
        if (bf(node) > 1 && bf(node.left) >= 0) {
            //LL -> 右旋
            return rightRotation(node);
        } else if (bf(node) > 1 && bf(node.left) < 0) {
            // LR -> 左右旋
            node.left = leftRotation(node.left);
            return rightRotation(node);
        } else if (bf(node) < -1 && bf(node.right) < 0) {
            // RR -> 左旋
            return leftRotation(node);
        } else if (bf(node) < -1 && bf(node.right) >= 0) {
            // RL -> 右左旋
            node.right = rightRotation(node.right);
            return leftRotation(node);
        }
        return node;
    }

    private AVLNode rightRotation(AVLNode p) {
        AVLNode l = p.left;
        AVLNode lr = l.right;
        l.right = p;
        p.left = lr;
        updateHeight(p);
        updateHeight(l);
        return l;
    }
    
    private AVLNode leftRotation(AVLNode p) {
        AVLNode r = p.right;
        AVLNode rl = r.left;
        r.left = p;
        p.right = rl;
        updateHeight(p);
        updateHeight(r);
        return r;
    }

    private void updateHeight(AVLNode node) {
        node.height = Integer.max(height(node.left), height(node.right));
    }

    private int bf(AVLNode node) {
        return height(node.left) - height(node.right);
    }

    private int height(AVLNode node) {
        if (node == null) {
            return 0;
        }
        return node.height;
    }


    /**
     * 节点信息
     */
    static class AVLNode {

        int key;

        Object value;

        AVLNode left;

        AVLNode right;

        int height = 1;

        public AVLNode(int key, Object value) {
            this.key = key;
            this.value = value;
        }

    }


}
【算法】数据结构与算法分析学习笔记——第四章AVL树C语言实现 看《数据结构与算法分析》第四章时介绍到了一个AVL树的东西 对于节点删除,书上只是提了一下惰性删除,也没有给出例程,这里就试着实现非惰性删除 实现的方法同二叉查找树,找一个左子树的最大节点进行替换,递归删除,并做及时的AVL树维护 阅读详情

相关推荐

数据结构与算法3 AVL树

将 26, 13, 44, 51, 98, 37, 66, 73 顺序插入一棵初始为空的AVL树。将 7, 8, 9, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。在将{42,26,8,70,102,56,2}插入一个初始空的 AVL 树时,下列哪个语句为真?如果节点{1,2,3,4}的 AVL 树的深度为3(根的深度为1) ,那么节点4可能是根。将2,1,4,5,9,3,6,7插入到一个初始的空 AVL 树中。非空的平衡二叉树中插入一个结点,原有结点中至少一个结点的平衡因子会改变。

ohuojiuwo的博客 3702

数据结构:AVL树详解(平衡二叉树)

假如以 parent 为根的子树不平衡,即 parent 的平衡因子为2或者-2,分以下情况考虑parent的平衡因子为2,说明parent的右子树高,设parent的右子树的根为subR当subR的平衡因子为1时,执行左单旋当subR的平衡因子为-1时,执行右左双旋parent的平衡因子为-2,说明parent的左子树高,设parent的左子树的根为subL当subL的平衡因子为-1是,执行右单旋当subL的平衡因子为1时,执行左右双旋。

机会是给有准备的人 6314

数据结构与算法中AVL树的代码实现

我们的目的是让大家完全理解AVL树这个数据结构,并且能够自己动手用代码实现它。范围涵盖了AVL树的基本概念、原理、代码实现的每一个步骤,还有它在实际中的应用情况。首先我们会引入一个有趣的故事来引出AVL树,接着详细解释AVL树的核心概念,然后说明这些概念之间的关系。之后会给出AVL树核心概念原理和架构的文本示意图以及Mermaid流程图。再用Python代码实现AVL树的核心算法,包括开发环境搭建、源代码详细实现和代码解读。

AI 算法实战派 1009

详解AVL树(平衡二叉树)

插入节点后对树进行旋转调整,分为四种情况。 1.右单旋 当一个平衡二叉树满足具有较高左子树时(如下图A),且要插入的节点插入到了较高左子树的左侧,此时进行右单旋。

水澹澹兮生烟 2万+

树在数据结构与算法中的AVL树应用

在计算机的世界里,数据就像宝藏一样,我们需要把它们好好地存放和管理,这样才能快速地找到我们想要的东西。树这种数据结构就像是一个聪明的仓库管理员,能帮助我们高效地存储和查找数据。而AVL树是树家族中的一个特殊成员,它有着独特的平衡特性,能让数据的查找、插入和删除操作都变得非常快。我们这篇文章的目的就是要详细地介绍AVL树,从它的基本概念到具体的实现,再到实际的应用,让大家对AVL树有一个全面的认识。我们会先介绍一些和AVL树相关的基本术语,让大家对这些概念有一个初步的了解。

AI 算法实战派 954

怎么用phpstudy制作网站

随着实践的深入,你会逐渐掌握更多高级技巧和技术,让你的网站变得更加完善和吸引人。现在你已经成功设置了你的本地Web服务器环境,接下来我们将指导你如何利用这个环境来创建一个简单的PHP网页项目。为了使网站更加动态且功能丰富,我们需要学会如何让PHP脚本与MySQL数据库交互。为了让网站看起来更专业美观,可以考虑引入CSS样式表来定制网页布局及视觉效果。当你对本地开发的网站感到满意后,下一步就是将其发布到互联网上供他人访问了。让我们进一步扩展我们的网站,加入一个简单的用户注册与登录系统。

2401_87999399的博客 6573

AVL树详解与实现

AVL树详细分析以及插入删除的c++实现

naturerun的博客 1609

不用SE63逐个翻译!ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量处理TCODE描述的3种姿势

本文介绍了三种利用ABAP函数LXE_OBJ_TEXT_PAIR_WRITE批量翻译SAP事务码(TCODE)描述的高效方案,旨在替代SE63逐个翻译的低效操作。内容涵盖从基础循环、Excel导入到全自动程序集成的实现方法,帮助开发者显著提升批量翻译效率,并深入解析了SAP翻译体系的核心原理与实战技巧。

weixin_42593130的博客 659

数据结构——AVL树详解

AVL树的模拟实现 AVL树的插入、旋转、删除、查找 AVL树的验证 AVL树的平衡因子

rab1211764820的博客 5258

不用公网IP,如何在内网高效搭建RustDesk远程控制服务器?基于Windows Server 2019的完整实践

本文详细介绍了在Windows Server 2019上部署RustDesk远程控制服务器的完整实践方案,无需公网IP即可实现内网高效远程控制。从环境准备、基础服务安装到网络与安全配置,提供了零成本的私有化部署指南,适用于企业、校园等内网环境。

weixin_28737073的博客 455

CODESYS Softmotion(一)功能介绍

一、CODESYS SoftMotion RTE SL产品 1.1 CODESYS Runtime SL 产品家族介绍 目前支持的主流厂商的硬件产品,让部署在上面的成为实时设备。 对于Windows系统,根据需求选择对应的Runtime: RTE极大的提高了实时性,适合进行运动控制,同时RTE还支持了多个主从站协议: 还可以选择可选的功能(Single License): RTE对硬件和系统有要求,如果你需要硬件功能,那么网卡会有最低要求。 1.2 RTE的下载和安装 在官网http://codes

Fishfishfishfishcat 2万+

AVL介绍

AVL树概念 AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持。而且要保证它的深度是O(logN). AVL的条件是左右树的高度差(平衡因子)不大于1;并且它的每个子树也都是平衡二叉树。 对于平衡二叉树的最小个数,n0=0;n1=1;nk=n(k-1)+n(k-2)+1;(求法可以类比斐波那契!) 难点:AVL是一颗二叉排序树,用什么样的规则或者规律让它能够在复杂度不太高的情况下实现...

weixin_44980072的博客 3786

【人工智能】Claude Code 安装、配置及问题排查完整指南

建议使用IDE来启动 Claude,执行后,内容如下。(确保环境可正常运行 npm 命令)。

奶爸的编程之路,也就一周冷个三天 1206

数据结构与算法-AVL树

这棵“畸形”的二叉树虽然依旧是一棵标准的BST,但却已经明显左轻右重了,事实上这棵二叉树已经退化成了一条链表,在这棵BST中搜索某一节点的时间复杂度跟链表是一样的。这种“左轻右重”或者“左重右轻”的长短腿的情形,就是所谓的不平衡,一棵树如果不平衡,那么他的搜索性能将会受到影响,具体来讲:当树保持平衡时,其搜索时间复杂度是𝑂(𝑙𝑜𝑔2𝑛)Olog2​n),当树退化成链表时,其搜索时间复杂度变成𝑂(𝑛)On),其他情况下树的平均搜索时间复杂度就介于这两者之间。

m0_74147998的博客 987

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1455

【即插即用模块】注意力篇 | TGRS 2025 | SCPP:独家复现!三特征多尺度注意力融合,涨点必备!

摘要:SCPP(Scale-aware Pyramid Pooling)是一种创新的多尺度特征融合模块,专为U型网络瓶颈设计。它通过局部特征提取(1×1卷积)、多尺度膨胀卷积(1/3/5膨胀率分支)和全局特征聚合(全局平均池化)三重结构,结合SE通道注意力机制和自适应加权融合,显著提升特征表达能力。实验表明,SCPP能有效解决边缘模糊和错误检测问题,在遥感图像分割等任务中表现优异。该模块支持即插即用,适用于各类需要多尺度特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 939

数据结构与算法——AVL树类的C++实现

关于AVL树的简介可以参考: 数据结构与算法——AVL树简介 关于二叉搜索树(也称为二叉查找树)可以参考:数据结构与算法——二叉查找树类的C++实现 AVL-tree是一个"加上了额外平衡条件"的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。要求任何节点的左右子树高度相差最多1。

Be The Best! 4074

用AI科研绘图全新升级!借助谷歌新发布模型Nano Banana pro实测一键绘制机制图与技术路线图,直接告别文字乱码与低画质

之前有同仁反馈,用Nano Banana画科研插图的时候,要么文字部分容易乱码,要么抓不住关键内容,画出来的效果反复修改后,还是达不到理想的效果。终于在Gemini 3发布没几天,万众期待的大香蕉模型也成功升级到了Pro版本,官方名称叫“Gemini 3 Pro Image”,实际上也就是我们说的Nano Banana 2。这次的Nano Banana Pro模型,不仅可以直出4K高清图,还能自定义比例,推理能力和中文文字的稳定性也得到了提升。

智能AI让学术科研更容易 1887

【数据结构与算法】AVL树

AVL 树是一种自平衡二叉搜索树,由托尔·哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字:Adelson-Velsky 和 Landis,他们是苏联数学家,于 1962 年发表了一篇论文,详细介绍了 AVL 树的概念和性质。在二叉搜索树中,如果插入的元素按照特定的顺序排列,可能会导致树变得非常不平衡,从而降低搜索、插入和删除的效率。为了解决这个问题,AVL 树通过在每个节点中维护一个平衡因子来确保树的平衡。平衡因子是左子树的高度减去右子树的高度。

程序员波特 1652

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

算法与数据结构:二叉排序树与AVL树

二叉排序树和AVL的实现过程,以及怎么进行平衡操作的过程详细解释

qq_58240849的博客 1355

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[算法] 数据结构之AVL树

1.基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋。下面我们来看看: 1.1AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1.本身首先是一棵二叉搜索树。 2.带有平衡条件:每个结点的左右子树的高度之差的绝...

a84480766的博客 202

【PTA】【数据结构与算法】AVL树

判断题 1.Insert 1, 2, 3, 4, 5, and 6 one by one into an initially empty AVL tree. Then the preorder traversal sequence of the resulting tree must be {4, 2, 1, 3, 5, 6}. (2分) T F 解析:以下演示了插入的过程,最后旋转.........

葑鈊丶 1万+

数据结构与算法之AVL树

目录(一) 定义(二) 自定义AVL树1.AVL树基础结构2.AVL添加操作3.AVL树删除操作 (一) 定义 通过前面的 数据结构与算法之二分搜索树 的学习我们知道, 二分搜索树的性能跟树的高度(h)存在必然联系: 1. 二分搜索树的添加操作, 删除操作, 查询操作 都需要在二分搜索树中找到合适的结点再进行逻辑操作, 找适到合结点所要经历的最多个数结点为 树的高度h. 2. 二分搜索树的高度h...

Admin_Lian的博客 334

数据结构与算法之树(三)AVL树

数据结构与算法之树 数据结构与算法之树(一)二叉树概念及遍历方式(图文并茂) 数据结构与算法之树(二)二叉查找树 数据结构与算法之树(三)AVL树 数据结构与算法之树(四)红黑树 数据结构与算法之树(三)AVL树 文章目录数据结构与算法之树(三)AVL树一、什么是平衡二叉树?二、什么是AVL树?三、AVL树的调整策略3.1 旋转操作3.1.1 左旋3.1.2 右旋3.2 需要调整的节点3.3 情况...

JT同学的博客 844

数据结构与算法分析-AVL树深入探讨

数据结构与算法分析-AVL树深入探讨 pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;} ...

weixin_34176694的博客 160
上一篇: 数据结构算法-红黑树
下一篇: SpringBoot扩展篇:@Scope和@Lazy源码解析
hao9e
博客等级 码龄7年 189粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值