96SEO 2026-02-19 18:02 0
前面对map/multimap/set/multiset进行了简单的介绍在其文档介绍中发现这几个容器有个共同点是其底层都是按照二叉搜索树来实现的但是二叉搜索树有其自身的缺陷假如往树中插入的元素有序或者接近有序二叉搜索树就会退化成单支树时间复杂度会退化成O(N)因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理即采用平衡树来实现。

二叉搜索树虽可以缩短查找的效率但如果数据有序或接近有序二叉搜索树将退化为单支树查找元素相当于在顺序表中搜索元素效率低下。
因此两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法当向二叉搜索树中插入新结点后如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整)即可降低树的高度从而减少平均搜索长度。
它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)平衡因子
节点是一个一个插入的有些情况是无法做到相等的最优就是高度差是1比如两个节点的树和四个节点的树等等。
AVL树就是在二叉搜索树的基础上引入了平衡因子因此AVL树也可以看成是二叉搜索树。
那么AVL树的插入过程可以分为两步
若是插入的是左节点则父节点的平衡因子减1若是插入的是右节点则父节点的平衡因子加1
是否要继续更新取决于新增节点会不会影响父节点的高度从而决定会不会影响爷爷节点
说明父节点的平衡因子是1或者-1父节点在矮的那边插入了节点左右均衡了于是父节点的高度不变则不会影响到爷爷更新结束
说明更新前父节点的平衡因子是0父节点变得不均衡但是不违反规则高度改变会影响爷爷节点继续往上更新
更新后父节点的平衡因子为2或-2说明该子树违反了平衡规则需要处理-旋转
parent;//新节点插入后AVL树的平衡性可能会遭到破坏此时就需要更新平衡因子并检测是否破坏了AVL树的平衡性/*pCur插入后pParent的平衡因子一定需要调整在插入之前pParent的平衡因子分为三种情况-10,
如果pCur插入到pParent的左侧只需给pParent的平衡因子-1即可2.
如果pCur插入到pParent的右侧只需给pParent的平衡因子1即可此时pParent的平衡因子可能有三种情况0正负1
如果pParent的平衡因子为0说明插入之前pParent的平衡因子为正负1插入后被调整成0此时满足AVL树的性质插入成功2.
如果pParent的平衡因子为正负1说明插入前pParent的平衡因子一定为0插入后被更新成正负1此时以pParent为根的树的高度增加需要继续向上更新3.
如果pParent的平衡因子为正负2则pParent的平衡因子违反平衡树的性质需要对其进行旋转处理*/while
parent-left){parent-_bf--;}else{parent-_bf;}//
说明以双亲为根的二叉树的高度增加了一层因此需要继续向上调整cur
双亲的平衡因子为正负2违反了AVL树的平衡性需要对以pParent为根的树进行旋转处理if
1){RotateLR(parent);}else{RotateRL(parent);}break;}else{//
插入之前AVL树就有问题assert(false);}}return
如果在一棵原本是平衡的AVL树中插入一个新节点可能造成不平衡此时必须调整树的结构
上图在插入前AVL树是平衡的新节点插入到30的左子树(注意此处不是左孩子)中30左子树增加了一层导致以60为根的二叉树不平衡要让60平衡只能将60左子树的高度减少一层右子树增加一层即将左子树往上提这样60转下来因为60比30大只能将其放在30的右子树而如果30有右子树右子树根的值一定大于30小于60只能将其放在60的左子树旋转完成后更新节点的平衡因子即可。
30节点的右孩子可能存在也可能不存在60可能是根节点也可能是子树
如果是根节点旋转完成后要更新根节点如果是子树可能是某个节点的左子树也可能是右子树
旋转完成之后30的右孩子作为双亲的左孩子pParent-_pLeft
因为60可能是棵子树因此在更新其双亲前必须先保存60的双亲PNode
将双旋变成单旋后再旋转即先对30进行左单旋然后再对90进行右单旋旋转完成后再考虑平衡因子的更新。
旋转之前60的平衡因子可能是-1/0/1旋转完成之后根据情况对其他节点的平衡因子进行调整
旋转之前保存pSubLR的平衡因子旋转完成之后需要根据该平衡因子来调整其他节点的平衡因子int
先对30进行左单旋_RotateL(pParent-_pLeft);//
再对90进行右单旋_RotateR(pParent);if(1
假如以pParent为根的子树不平衡即pParent的平衡因子为2或者-2分以下情况考虑
pParent的平衡因子为2说明pParent的右子树高设pParent的右子树的根为pSubR
当pSubR的平衡因子为1时执行左单旋当pSubR的平衡因子为-1时执行右左双旋
pParent的平衡因子为-2说明pParent的左子树高设pParent的左子树的根为pSubL
当pSubL的平衡因子为-1是执行右单旋当pSubL的平衡因子为1时执行左右双旋
旋转完成后原pParent为根的子树个高度降低已经平衡不需要再向上更新。
parent-left){parent-_bf--;}else{parent-_bf;}if
1){RotateLR(parent);}else{RotateRL(parent);}break;}else{//
插入之前AVL树就有问题assert(false);}}return
subLR-_bf;RotateL(parent-_left);RotateR(parent);if
0;}else{assert(false);}}private:Node*
AVL树是在二叉搜索树的基础上加入了平衡性的限制因此要验证AVL树可以分两步
每个节点子树高度差的绝对值不超过1(注意节点中如果没有平衡因子)节点的平衡因子是否计算正确
计算pRoot节点的平衡因子即pRoot左右子树的高度差int
pRoot的左和右如果都是AVL树则该树一定是AVL树return
_IsBalanceTree(pRoot-_pRight);}6
因为AVL树也是二叉搜索树可按照二叉搜索树的方式将节点删除然后再更新平衡因子只不错与删除不同的时删除节点后的平衡因子更新最差情况下一直要调整到根节点的位置。
具体实现学生们可参考《算法导论》或《数据结构-用面向对象方法与C描述》殷人昆版。
AVL树是一种自平衡的二叉搜索树它的删除操作与插入操作类似但需要在删除节点后进行平衡操作以保持树的平衡性。
如果待删除的节点是叶子节点直接删除即可。
如果待删除的节点只有一个子节点将子节点替代待删除节点的位置。
找到待删除节点的前驱或后继节点将其值复制到待删除节点并将前驱或后继节点删除。
找到待删除节点的左子树中的最大值或右子树中的最小值将其值复制到待删除节点并将最大值或最小值节点删除。
删除节点后需要从被删除节点的父节点开始向上回溯检查每个祖先节点是否平衡。
如果发现某个祖先节点不平衡需要进行相应的旋转操作来恢复平衡。
AVL树是一棵绝对平衡的二叉搜索树其要求每个节点的左右子树高度差的绝对值都不超过1这样可以保证查询时高效的时间复杂度即
log2(N)。
但是如果要对AVL树做一些结构修改的操作性能非常低下比如插入时要维护其绝对平衡旋转的次数比较多更差的是在删除时有可能一直要让旋转持续到根的位置。
因此如果需要一种查询高效且有序的数据结构而且数据的个数为静态的(即不会改变)可以考虑AVL树但一个结构经常修改就不太适合。
AVL树是一种自平衡二叉搜索树它的性能相对于普通的二叉搜索树更加稳定。
AVL树的性能可以从以下几个方面来介绍
查找操作AVL树的查找操作与普通的二叉搜索树相同时间复杂度为O(log
n)其中n为树中节点的数量。
由于AVL树是平衡的所以查找操作的性能是稳定的。
插入和删除操作AVL树在插入和删除节点时会进行自平衡操作以保持树的平衡性。
这些自平衡操作包括旋转和重新计算节点的平衡因子。
插入和删除操作的时间复杂度也是O(log
n)但由于需要进行自平衡操作所以相对于普通二叉搜索树AVL树的插入和删除操作可能会更耗时。
平衡性AVL树的平衡性保证了树的高度始终保持在一个较小的范围内。
具体来说AVL树的任意节点的左右子树高度差不超过1。
这种平衡性保证了查找、插入和删除操作的时间复杂度都能够保持在O(log
空间复杂度AVL树的空间复杂度与节点数量成正比即O(n)。
每个节点需要存储键值对以及额外的平衡因子信息。
总的来说AVL树在查找操作上具有较好的性能但在插入和删除操作上可能会稍微慢一些。
然而AVL树的平衡性保证了树的高度始终保持在一个较小的范围内从而保证了整体的性能稳定性。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback