AVL树

AVL树的构造实现 今天接触的是平衡二叉查找树,对于AVL树来说相比之前的数据结构稍微多了一些需要注意的地方,照例在此总结总结让自己巩固一二。 首先是使用AVL树的动机: 我们知道AVL树本质上是排序二叉树的一类特例,回顾一下,对于排序二叉树的定义考虑使用归纳定义: ①、空树是二叉查找树; ②、若p和q都是二叉查找树,而root是一个“关键字大于p上所有结点的关键字,并小于q上所有结点的关键字”的元素 阅读详情

定义:一棵空二叉树是AVL树,如果T是非空二叉树,TL和TR分别是其左子树和右子树,

则当且仅当TL和TR都为AVL树且|HL-HR|<=1时,T是AVL树。

由定义知道一个AVL树的任何节点的左右子树的高度之差不超过1,这是AVL树最基本的特征。

AVL树的高度:(固定节点数计算最大高度)

记N_h为一棵高度为h的AVL树具有的最小节点数,则最坏情况是它的左右子树的高度不等,

一个是N_(h-1)和N_(h-2),从而得到

N_h=N_(h-1)+N_(h-2)+1            N_0=0,N_1=1

这类似于Fibonacci数列:F_n=F_(n-1)+F_(n-2),(F_0=0,F_1=1)

而F_h=(1+sqrt(5))^h/sqrt(5)

从而高度h和节点数是对数关系,因此 h=O(log(N_h))

由此容易知道在不考虑恢复AVL树的前提下,它的插入,删除和查找的工作量不超过O(n)。

AVL树节点的平衡因子:

AVL树节点的平衡因子定义为其左子树的高度减去右子树的高度,我们可以在插入和删除操作的时候更新平衡因子。

一棵AVL树的各节点平衡因子为1,-1, 0

树的旋转:

在介绍插入和删除操作之前首先介绍树的旋转操作

树的旋转操作是为了改变树的结构,使其达到平衡。旋转总共分为左旋和右旋两类

左旋

如图为树的以B为轴左旋示意图,从右到左是以A为轴右旋,树的旋转操作要特别注意儿子节点是否为空

顶层节点是否为根节点。

AVL树的插入操作:

插入操作只会改变被插入节点到根节点路径上的节点的平衡因子。

因为在插入之前树是AVL树,因此各个节点的平衡因子是1,-1或0

一、如果路径上节点平衡因子是0,则插入后不会打破这个节点的平衡性。

二、如果路径上的节点的平衡因子是1或-1,则可能会打破平衡性,在这种情况下如果此节点的新的平衡

因子是0,则刚好将其补的更加平衡,平衡性未打破;否则平衡因子变成2或-2,则需要进行调整。

三、我们在对树进行调整后恢复子树相对于插入前的高度,不改变子子树的平衡因子。

由以上三点:只需向根部查找从插入点开始第一个平衡因子不为0的节点,令该节点为A

更新步骤:

(1). 若A不存在,说明插入节点不影响平衡性,则自下而上更新平衡因子直到根部即可。

(2). 若bf(A)=1且插入节点在A地右子树中,或者bf(A)=-1且插入节点在A的左子树中,则自下而上更新

平衡因子直到A。(注:A的平衡因子变为0)

(3). 若A的平衡性被打破,首先依然自下而上更新平衡因子,在按照下面进行分类:LL, LR, RR, RL

原bf(A)=1, 新的bf(A)=2, LL, LR,

原bf(A)=-1, 新的bf(A)=-2, RR, RL

如图为RR的情况,LL情况类似,旋转后只需再次改变两个节点的平衡因子

RR

如下图为RL的情况,LR类似,旋转后需要再次改变三个节点的平衡因子

RL

至此,插入操作已经完成,可见最多多做两次旋转操作调整树的结构使之平衡。

AVL树的删除操作:

删除操作和插入操作一样,也是先直接删除二叉树节点,然后在更新平衡因子,

调整AVL树使之平衡。

这里所指的删除的节点是实际被删除的节点,删除操作不影响其子树的平衡因子。

首先删除节点,然后沿着该节点的父节点向根部更新平衡因子,考虑更新后的节点A

新的平衡因子,分为下面三种情况:

(1)、如果bf(A)=0,则高度减少了1,从而继续向上找非平衡点。

(2)、如果bf(A)=1或者-1,则之前必为0,从而不影响平衡性,结束。

(3)、如果bf(A)=2(原来为1)或者-2(原来为-1),则A点非平衡。调整。

以bf(A)=-2为例,称A为L不平衡

如果A的右节点的平衡因子是0,则进行一次左旋转,如图:

L0

由于子树的高度和删除前一样,因此树已经平衡。

如果A的右节点的平衡因子是-1,则称为L-1不平衡,也要进行一次做旋转。

L-1

树的高度减少1,这使得上面的祖先节点可能不平衡,一次还要沿着路径在向上

寻找新的不平衡点,再次更新平衡因子,调整等。

如果A的右节点的平衡因子是1,则称为L1不平衡,要进行两次旋转。

L1

此时要根据BL的情况决定A和B的新的平衡因子。

由于树的高度减少了1,因此还要沿着路径继续向上寻找新的不平衡点。

至此树节点的删除操作完成。

总结:

归纳起来,AVL树的查找操作等同于一般二叉树,插入和删除操作除了一般的二叉树插入和删除

还要更新树的平衡因子,当平衡因子被打破时要通过旋转恢复。而且在调整平衡时尽量影响局部范围。

DeepMD-kit描述子机制解析:从原子坐标到不变性特征 本文深入解析DeepMD-kit描述子机制,详细阐述如何将原子坐标转换为具有平移、旋转和排列不变性的特征表示。探讨了se_e2_a、se_e3等不同描述子的适用场景及性能优化技巧,帮助读者掌握这一关键技术在分子模拟中的应用实践。 阅读详情

相关推荐

别再盲调PID了!手把手教你用VOFA+实时可视化电机速度曲线(附STM32F4源码)

本文详细介绍了如何使用VOFA+工具实现PID参数的可视化调试,帮助开发者从盲调转向精准调优。通过实时可视化电机速度曲线,结合STM32F4源码示例,展示了如何高效调试Kp、Ki、Kd参数,解决响应慢、超调等常见问题,大幅提升电机控制系统的性能。

weixin_28366475的博客 128

AVL树高度求解

因为我们之前讲过了左旋转, 右旋转, 双旋转, 但是在实际编码中会有一个问题: 我们要确定LL型, LR型, RR型, RL型最小不平衡子树时需要, 所以这里我们首要问题就是要求解对应结点的左右子树的高度差, 其实就是求树的高度后再作差。

m0_57001006的博客 830

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 214

树(三)AVL树

AVL树是对二叉查找树的改进,注意任何对二叉查找树的改进都必须保证树具有O(logN)的深度或摊还深度,若深度增加到O(N)级别,就和链表一样了,没有意义。AVL树保证了O(logN)深度的同时具有平衡性,是一种自平衡二叉查找树。AVL树平均高度大概是1.44logN + c,c是常数,是O(logN)级别。 比二叉查找树增加的结构性:要求每个节点的左子树和右子树的高度相差最多为1,(为了方便N...

kdb_viewer的博客 1078

GD32F4x芯片加密实战:从读保护到安全启动全解析

本文详细解析了GD32F4x芯片加密的实战操作,从读保护功能到安全启动全流程。通过具体代码示例和应用场景分析,帮助开发者有效防止固件被盗用,提升工业控制、智能门锁等场景下的数据安全性。重点介绍了读保护功能的底层机制、配置步骤及常见问题解决方案。

weixin_42629671的博客 207

电化学阻抗谱(EIS)在锂离子电池中的应用

摘要电化学阻抗谱(electrochemical impedance spectroscopy, EIS)是一种重要的电化学测试方法,在锂离子电池动力学反应机理研究及动力学参数测量等方面具有广泛的应用。在锂离子电池运行过程中,各反应步骤的动力学参数及时间常数不同,而EIS可以在较宽的频率范围内对体系施加小幅正弦激励信号,使得在特定频率下突出特定时间常数的电极过程,从而将复杂的电极过程分离,实现单一电极过程动力学的分析。通过对交流阻抗信息的研究,也可以为锂离子电池及其他电池的应用与管理、电化学过程设计及电极材

qiushireader的博客 2649

数据结构——AVL树详解

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

rab1211764820的博客 5258

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现

Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 Car Racing 2D (2D赛车) 休闲小游戏快速实现 一、简单介绍 二、Car Racing 2D (2D赛车) 游戏内容与操作 三、相关说明 四、游戏代码框架 五、知识点 六、游戏效果预览 七、实现步骤 八、工程源码地址 九、延伸扩展 一、简单介绍 Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便

仙魁XAN 7701

高级数据结构与算法 | AVL树 (高度平衡树)

文章目录AVL树实现思路数据结构查找平衡因子旋转右旋左旋右左双旋左右双旋插入删除AVL树的验证中序遍历平衡判断AVL树的性能完整代码实现 AVL树 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis AVL树其实就是在二叉搜索树的基础上,引入了平衡因子的概念,通过旋转来调整平衡因子,使得二叉树始

凌桓丶的博客 3936

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

weixin_42412049的博客 2297

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

C++AVL树

AVL树零、前言一、AVL树的概念二、AVL树结点定义三、AVL树的插入四、AVL树的旋转1、左单旋2、右单旋3、左右双旋4、右左双旋5、总结五、AVL树的验证六、AVL树的性能 零、前言 本章主要讲解map和set的底层结构平衡二叉搜索树的一种-AVL树的特性及其实现 一、AVL树的概念 引入: map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷 假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退

~ 2821

若依框架二次开发——若依 Vue3 版本前端样式优化指南

若依框架二次开发——若依 Vue3 版本前端样式优化指南

bjzhang75的博客 1692

AVL树的旋转

文章目录定义AVL树的旋转左单旋转右单旋转双旋转 定义         一棵AVL树可以是空树,也可以是具有下列性质的二叉搜索树:它的左子树和右子树都是AVL树,且左子树和右子树的高度之差的绝对值不超过1(也就是小于等于1)。(右子树高度 - 左子树高度)         节点的平衡因子:给每个节点附加一个数字,给出该节点右子树的高度减去左子树的高度

Colorful_X的博客 4894

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C++】AVL树

本篇内容到这里就结束了,主要讲了AVL树的定义与主要接口实现,希望对大家有帮助,祝生活愉快,我们下一篇再见!

春风不语。 2039

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++之AVL树的介绍以及AVL树自我实现

AVL树是一种自平衡的二叉查找树,它的名字来源于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。

zzh_Zao的博客 1819

AVL树的删除

引言 AVL树的定义及性质及其重要的插入方法,我已在AVL树的插入一文中详细阐述过了,其中重要的旋转也已进行详细描述。 本文就不再赘述了,直接使用,要是不清楚的小伙伴,还请移步AVL树的插入再回头复习一下下。 AVL树的删除 AVL树的删除步骤如下: 寻找删除目标(存不存在,定位出目标) 判断删除目标的类型,使用转换的思路,将其转化为删除叶子 将删除目标与AVL树链接断开,调整平衡,完成删除 寻找删除目标 寻找删除目标的思路很简单,因AVL树也属于BST,因此寻找目标的做法与BST的删除思路基本一致。

qq_39208237的博客 5888

AVL树:AVL树的实现

pair是将2个数据组合成一组数据,如stl中的map就是将key和value放在一起来保存,或者当一个函数需要返回2个数据的时候,也可以选择pair。pair的实现是一个结构体,主要的两个成员变量first和second,分别存储两个数据, 因为是使用struct不是class,所以可以直接使用pair的成员变量。//_pf记录高度差(右子树高度减去左子树高度)int _pf;

2301_80468112的博客 837

C++——AVL树

AVL树的简介

二哈的博客 1716
上一篇: typedef定义函数指针
下一篇: 让rm命令提示确认后再删除
Iphone4
博客等级 码龄17年 17粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值