当前位置: 首页 > article >正文

16.AVL树实现

1.AVL概念:

1.1意为平衡二叉搜索树:他的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。通过控制⾼度差去控制平衡。

2.AVL树实现这⾥我们引⼊⼀个平衡因⼦(balance factor)的概念,每个结点都有⼀个平衡因⼦,任何结点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等0/1/-1,AVL树并不是必须要平衡因⼦,但是有了平衡因⼦可以更⽅便我们去进⾏观察和控制树是否平衡,就像⼀个⻛向标⼀样。

3.AVL树整体结点数量和分布和完全⼆叉树类似,⾼度可以控制在 ,那么增删查改的效率也可以控制在 ,相⽐⼆叉搜索树有了本质的提升。

2.AVL树的实现

2.1AVL树的插入

1. 插⼊⼀个值按⼆叉搜索树规则进⾏插⼊。
2. 新增结点以后,只会影响祖先结点的⾼度,也就是可能会影响部分祖先结点的平衡因⼦,所以更新
从新增结点->根结点路径上的平衡因⼦,实际中最坏情况下要更新到根,有些情况更新到中间就可
以停⽌了。
3. 更新平衡因⼦过程中没有出现问题,则插⼊结束
4. 更新平衡因⼦过程中出现不平衡,对不平衡⼦树旋转,旋转后本质调平衡的同时,本质降低了⼦树
的⾼度,不会再影响上⼀层,所以插⼊结束。

 2.2平衡因子更新

更新原则:
• 平衡因⼦ = 右⼦树⾼度-左⼦树⾼度
• 只有⼦树⾼度变化才会影响当前结点平衡因⼦。
• 插⼊结点,会增加⾼度,所以新增结点在parent的右⼦树,parent的平衡因⼦++,新增结点在
parent的左⼦树,parent平衡因⼦--
• parent所在⼦树的⾼度是否变化决定了是否会继续往上更新

 2.3更新停止条件

• 更新后parent的平衡因⼦等于0,更新中parent的平衡因⼦变化为-1->0 或者 1->0,说明更新前
parent⼦树⼀边⾼⼀边低,新增的结点插⼊在低的那边,插⼊后parent所在的⼦树⾼度不变,不会
影响parent的⽗亲结点的平衡因⼦,更新结束。

• 更新后parent的平衡因⼦等于1 或 -1,更新前更新中parent的平衡因⼦变化为0->1 或者 0->-1,说
明更新前parent⼦树两边⼀样⾼,新增的插⼊结点后,parent所在的⼦树⼀边⾼⼀边低,parent所
在的⼦树符合平衡要求,但是⾼度增加了1,会影响parent的⽗亲结点的平衡因⼦,所以要继续向
上更新。

• 更新后parent的平衡因⼦等于2 或 -2,更新前更新中parent的平衡因⼦变化为1->2 或者 -1->-2,说
明更新前parent⼦树⼀边⾼⼀边低,新增的插⼊结点在⾼的那边,parent所在的⼦树⾼的那边更⾼
了,破坏了平衡,parent所在的⼦树不符合平衡要求,需要旋转处理,旋转的⽬标有两个:1、把
parent⼦树旋转平衡。2、降低parent⼦树的⾼度,恢复到插⼊结点以前的⾼度。所以旋转后也不
需要继续往上更新,插⼊结束。

• 不断更新,更新到根,跟的平衡因⼦是1或-1也停⽌了。

 

3.旋转

3.1 旋转的原则
1. 保持搜索树的规则
2. 让旋转的树从不满⾜变平衡,其次降低旋转树的⾼度
旋转总共分为四种,左单旋/右单旋/左右双旋/右左双旋。
在a⼦树中插⼊⼀个新结点,导致a⼦树的⾼度从h变成h+1,不断向上更新平衡因⼦,导致10的平
衡因⼦从-1变成-2,10为根的树左右⾼度差超过1,违反平衡规则。10为根的树左边太⾼了,需要
往右边旋转,控制两棵树的平衡。
图示为很好的概括情景

 *照着图写代码,注意指针间的关系

 左单旋与右单旋类似,不给代码了

 3.3左右双旋

 

 

4.AVL树的查找

5.AVL树平衡检测


http://www.kler.cn/a/584158.html

相关文章:

  • 自动化测试 | Python+PyCharm+Google Chrome+Selenium 环境安装记录
  • 数据可视化图表库LightningChart JS 全新发布v7.0——提高视觉质量
  • SpringBoot为什么流行以及能解决什么问题?
  • 个人学习编程(3-13) 刷题2
  • Linux下用多进程在GPU上跑Pytorch模型问题
  • python -面试题--算法
  • 安科瑞ACCU-100微电网协调控制器:助力绿色能源系统运行
  • JVM之基础知识
  • 以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了
  • 蓝桥杯 互质数的个数
  • Axure RP下载安装和简单使用教程
  • 浙江大学:DeepSeek行业应用案例集(153页)(文末可下载PDF)
  • Python爬虫:从人民网提取视频链接的完整指南
  • 使用1Panel一键搭建WordPress网站的详细教程(全)
  • 力扣hot100二刷——链表
  • 【Linux 指北】常用 Linux 指令汇总
  • 强化学习(赵世钰版)-学习笔记(7.时序差分学习)
  • Centos离线安装openssl
  • DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?
  • 单体架构、微服务组件与解决方案