数据结构:AVL树与伸展树

数据结构专题——1.从BST到BBST BST BBST AVL树 伸展树 B树 B+树 红黑树 阅读详情

1.AVL Tree

核心思想:AVL Tree中每个节点都会有一个值,为depth(left)-depth(right),理想状态下为了维持平衡,这个值应当为-1,0,1。倘若这个值在insert or remove后变为-2或者2,则需要通过旋转进行变换。

旋转:(1)单旋转:LL与RR

如图,当插入2后,6的值为2(左深3右深1),所以要对6进行LL旋转。具体如下:

def LL:

       let node* temp equal root->left (temp will be the root in future)

       root->left equal to temp->right

       temp->right equal to root

       temp->height equal to (max of height(t->left) and height(t->right)) plus 1

       root->height equal to (max of height(temp->left),height(root)) plus 1

具体代码如下:

template<class KEY,class OTHER>

void AVLTree<KEY, OTHER>::LL(AVLNode*& t)

{

       AVLNode* t1 = t->left; //未来的树根

       t->left = t1->right;

       t1->right = t;

       t->height = max(height(t->left), height(t->right)) + 1;

       //此处的+1是t自己为树提供的高度!!

       t1->height = max(height(t1->left), height(t)) + 1;

}

同理,可以得到对称的右旋RR,具体代码如下

template<class KEY,class OTHER>

void AVLTree<KEY, OTHER>::RR(AVLNode*& t)

{

       AVLNode* t1 = t->right;

       t->right = t1->left;

       t1->left = t;

       t->height = max(height(t->left), height(t->right)) + 1;

       t1->height = max(height(t1->right), height(t)) + 1;

       t = t1;

}

(2)多旋转:LR与RL

此时对G来说,导致它更深的是LR(左枝的右枝),所以要进行LR旋转。

实际上LR旋转可以先通过RR(root->left)转化为LL形式,而后通过LL(root)旋转即可。

伪代码如下:

def LR:

       RR(root->left)

       LL(root)

代码如下:

template<class KEY,class OTHER>

void AVLTree<KEY, OTHER>::LR(AVLNode*& t)

{

       RR(t->left);

       LL(t);

}

对称的,我们可以得到RL的旋转方法。

template<class KEY,class OTHER>

void AVLTree<KEY, OTHER>::RL(AVLNode*& t)

{

       LL(t->left);

       RR(t);

}

2.伸展树

伸展树用于保证连续M次对树操作最多花费O(MlogN),但是不保证每次访问花费θ(logN),也就是说伸展树可以保证整体的平均访问速度,但是不确保个体的访问速度。

其基于这样的基本事实:二叉查找树的每次操作最坏情况O(N)并不坏,只需要很少发生即可。

当我们深入访问了一个节点后,我们必须对其进行移动!因为经验表明,访问一次后很大概率会多次访问!

其基本思路是:当一个节点被访问后,通过AVL树旋转向根推进。

实施方法:展开:

(1)面对LR(RL)则使用LR(RL)旋转即可

(2)面对LL(RR)进行对称镜像操作

看起来没什么区别,但是展开操作不仅能将访问节点移动到根处,还能降路径上大部分节点深度大致减少一半的效果。

AI报告撰写实战指南:从提示词工程到全流程优化的底层逻辑与实践突破 传统AI写作常被诟病为“信息拼贴”——模型虽能生成文本,却常出现逻辑断裂、数据矛盾、风格不符等问题。而“全流程优化”则是通过系统化设计,将报告生成拆解为需求解析→数据对齐→提示词设计→初稿生成→迭代优化→格式适配六大环节,每个环节均通过技术手段提升输出质量。提示词工程:本质是通过结构化指令(如角色设定、任务分解、格式约束、示例引导)精准控制模型输出方向,是连接用户需求与模型能力的“翻译器”。全流程优化。 阅读详情

相关推荐

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 374

AVL树和伸展树-二叉树-数据结构与算法

AVL树(高度平衡树) AVL树是高度平衡的二叉树。它的特点是:树中任何节点的两个子树的高度最大差别为1 结构体定义: class AVLTreeNode{ public: T key; // 关键字(键值) int height; // 高度 AVLTreeNode *left; /...

c+c++的博客 470

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

改进的二叉搜索树-AVL树与伸展树(Splay)

平衡的二叉搜索树 (AVL) 性质 可以为空 具有 n 个结点的 AVL 树,高度为 O (log n) 如果 T是一棵 AVL树,那么它的左右子树 TL、TR 也是 AVL 树 并且 | hL-hR|≤1 hL、hR 是它的左右子树的高度 平衡因子 平衡因子,bf (x) : Bf (x) = h(左孩子) - h(右孩子) 结点平衡因子可能取值为 0,1 和 -1 AVL 树结点...

weixin_33957648的博客 504

【项目分享】RailTracker: 火车票务数据采集与分析

从12306使用爬虫爬取火车站及车次信息、火车票价 通过本项目,我们将带领访问者手把手完成火车票数据采集、数据清洗、数据集成、可视化的一整个流程!

zhushatong的博客 3345

别再只调A*算法了!聊聊ROS机器人导航中,OpenCV视觉信息如何与激光雷达数据“打配合”

本文探讨了ROS机器人导航中激光雷达与OpenCV视觉融合的实战策略,揭示了如何通过多模态感知提升导航精度。文章详细介绍了视觉特征到代价地图的转化方法、系统级挑战的工程解决方案,以及融合感知下的路径规划进化,帮助开发者优化机器人导航系统。

weixin_29278805的博客 226

AVL树、splay树(伸展树)和红黑树比较

AVL树、splay树(伸展树)和红黑树比较 一、AVL树: 优点:查找、插入和删除,最坏复杂度均为O(logN)。实现操作简单     如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实际情况大多不是随机的。如果是随机的,则AVL    树能够达到比RB树更优的结果,因为AVL树的高度更低。如果只进行插入和查找,则AVL树是优于RB树的,因为RB树    更多的优势还是...

weixin_34380781的博客 952

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南)

本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。

weixin_26800111的博客 458

AVL树和伸展树

在树的结构中,一个最重要的用途是用作二叉搜索树。接下来使用搜索树结构有效的实现有序映射。 二叉搜索树的结构特性产生的最重要的结果是搜索算法。在search中,搜索一次下降一层,树高为h,每一个节点的搜索时间为O(1)(至于为什么是O(1),则涉及到哈希表的设计),则最坏情况下总的搜索时间为O(h)。 基于二叉搜索树,提供了聊两种性能更高的搜索树算法。分别是AVL树,伸展树。当然还有红黑树和多路...

fenglei0415的博客 1576

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4464

65页PPT全面学习大型汽车集团企业IT信息化(管理架构、应用架构、技术架构)

订单到交付(OTD):借助ERP、MES、LES、SRM、QMS、APS等系统,实现财务与业务一体化、高级排产、生产过程自动化及供应链协同。- 数据标准化:数据标准化是企业信息化建设基石,包括制定统一业务解释和标准、维护管理流程、发布应用等,涉及数据统一定义、分类、编码等内容。- 大数据应用:汽车行业大数据应用涵盖生产、销售、售后等环节,如设备预见性保养、销量预测、质量预警等,提升企业运营效率和决策能力。- 策略明晰:明确C2M管理矩阵,包括供应商、采购、物流、制造、销售、财务等环节的策略。

cdfunlove的博客 1050

The Algorithms - PHP高级数据结构:AVL树、伸展树与字典树的实现

在计算机科学领域,数据结构是构建高效算法的基础。PHP作为一种广泛使用的服务器端脚本语言,虽然在高性能计算方面不如C++或Java,但通过精心实现的数据结构,依然可以处理复杂的问题。本文将深入探讨三种高级数据结构——AVL树、伸展树和字典树(Trie)——在PHP中的实现,帮助开发者理解它们的工作原理和应用场景。 ## 什么是高级数据结构? 高级数据结构是对基本数据结构(如数组、链表)的扩展和

gitblog_00293的博客 1070

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 620

数据结构:平衡二叉树(AVL树),伸展树,B-树

AVL树(平衡二叉查找树) 同样的数据,不同的插入顺序,将导致不同的深度和平均查找长度ASL(刻画查找效率)。 为了加速搜索,可以使用二叉树,但是二叉树不加限制的话,可能会出现“八”字型的情况,导致O(N). 定义: 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。 即带有平衡条件的二叉查找树。 平衡因子:子树高度差。Balance Factor(简称BF)。BF( T ) ...

Johnson Guo的博客 733

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法学习笔记——数据结构:二叉搜索树BST、AVL树、伸展树、B树、B+树

二叉搜索树BST 二叉搜索树BST,即BinarySearchTree,其特性是: 对于任意节点,如果其值为val,则左子树所有节点值小于等于val,且右子树所有节点值大于等于val 注意利用此特性,避免多余的访问 def traverseBST(node: TreeNode, target: int): """BST遍历框架""" if node is None: return if node.val == target:

Insomnia_X的博客 493

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构 C++:树、查找二叉树、平衡树(AVL树)、伸展树(SplayTree)总结

树 相关术语: root 根 edge 边 child 子节点 parent 父节点 leaf 叶节点 sibling 兄弟节点 path 路径:从节点n1 到 nk的路径定义为:节点n1 n2 n3 … nk 的序列, 使得对于1<=i<k的节点ni是ni+1的父节点。路径的长(length)即为该路径上的边的数量, 即k-1. depth 深度:从根节点到ni的唯一路径的长。特别的,根的深度为0. internal path length 内部路径长:一棵树的所有节点的深度的和称为内部路径

Qiao712的博客 453

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数据结构——树

  1.AVL树(自平衡二叉查找树) 1)插入 avl树的插入操作每次可能会导致多个祖先失衡,但是它只要修改一次(最低的那个祖先节点),更高的祖先的高度也会复原。 解决办法:单旋,复杂度为O(1);双旋(对应于”之“字形的情况)(实际并非简单地如此操作)(O(logn)) 具体实现:   2)删除 avl树的删除操作每次只可能导致一个祖先失衡(因为若删除一个节点导致失衡,则该节...

lianup的博客 389

数据结构与算法分析全流程笔记(二):树

数据结构:树 的学习笔记,简单地过一遍概念。

Wiayetr的博客 1639

伸展树

伸展树保证从空树开始连续M次对树的操作最多花费O(M log N)时间。一棵伸展树每次操作的摊还代价是O(log N)。        伸展树的基本 想法是,当一个节点被访问后,它就要经过一些列AVL树的旋转被推到根上。因为在许多应用中当一个节点被访问时,它很可能不久再被访问。

Paul Joo的专栏 266

数据结构学习笔记(七)搜索结构

本系列笔记基于 清华大学出版社的《数据结构:用面向对象方法与C++语言描述》第二版进行学习。int data;// 二叉树节点类// 左右子女public:~BST() {};= NULL)?// 赋值private:// 停止标志// 搜索// 置空// 打印// 复制// 求最小// 求最大// 递归插入// 删除。

Lmz_0314的博客 1088

几种常见树形数据结构小结

最近新学习了很多厉害的数据结构,在大佬们的熏陶之下,也感悟了很多,对大佬们的实力也有了更加深厚的了解(先膜一番orz,换个姿势zto,再来一次owz)左偏树左偏树又名可并堆,多被用来对一些需要合并的一个集合体进行操作,但其本身只能用于储存最大值或是最小值,说来还是有一些鸡肋。但是在一些仅仅需要找最大值,并将几个堆合并起来时使用还是会有奇效。就好比猴王(详见我的博客),在这道题中使用可并堆就会有出其不

Y_sofun的博客 3940

6天通吃树结构

 第一天 儿茶 http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html

jeiwt的专栏 1749

【】平衡树!

直接贴代码,纯算法网上教程一大堆,我又不想费劲巴拉地写复杂度分析。

qq_35981399的博客 176

【洛谷 P3369】【模板】普通平衡树

提高+/省选−

2601_96575140的博客 487

伸展树(Splay tree)图解与实现

个人技术博客:http://blog.ztgreat.cn 一、伸展树    本文介绍了二叉查找树的一种改进数据结构–伸展树(Splay Tree)。它的主要特点是不会保证树一直是平衡的,但各种操作的平摊时间复杂度是O(log n),因而,从平摊复杂度上看,二叉查找树也是一种平衡二叉树。另外,相比于其他树状数据结构(如红黑树,AVL树等),伸展树的空间要求与编程复杂度要小得多。 伸展树...

小张的专栏 4万+
上一篇: 数据结构:排序算法
下一篇: 数据结构:红黑树与AA树
fo_sec
博客等级 码龄5年 53粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值