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

高阶数据结构-----三种平衡树的实现以及原理(未完成)

TreeMap和TreeSet的底层实现原理就是红黑树

一)AVL树:

1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,高度平衡的二叉搜索树,他的左右子树都是二叉搜索树

          AB             C
甲    乙      丙      丁

我们在这里面得出一个结论: Key(甲)<Key(B)<Key(乙)<Key(A)<Key(丙)<Key(C)<Key(丁)

2)必须是一颗平衡树:任意树中的节点,要求结点左子树的高度和结点右子树的高度差的绝对值不可以超过1,左右子树的高度差不能超过1;

平衡因子=左子树的高度-右子树的高度,我们在AVL树中任取一个节点,他的平衡因子只能是-1,1,0;

3)AVL树任意一颗以根节点的左右子树的高度差的绝对值不超过1,所以AVL树尽量保证左树和右树的高度是一致的,那么这个时候再次进行数据查找的时间复杂度就是O(logN)

4)当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过,(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度

二)AVL树的查找与插入:如果插入失败了,那么只有一种情况那么就是当前我要插入的数值在原来的树中已经有了

随着节点的插入,导致了平衡因子发生了变化,所以我们要进行平衡因子的调节

1)如图所示,在上面这张图中当我们想要插入10这个节点的时候,parent此时指向的是9这个节点,此时10插入到了9的右子树,那么9的平衡因子++,此时parent的平衡因子是1,但是只能证明当前这棵树已经平衡了,还是需要进行向上调整

2)此时如果插入的数据是8.5,那么此时插入到的位置是9的左边,此时parent的平衡因子是-1,此时也是只能证明当前这棵树平衡了,还是需要继续向上调整的;

3)但是如果此时我们进行插入的数据是7.5,那么此时parent节点指向8这个位置,成功插入7.5这个数据之后发现parent的平衡因子变成0,此时就不需要向上调整了

当parent.bf==2的时候,说当前这棵树已经不平衡了,说明此时右树高,说明要降低右树的高度,增加左树的高度,所以要进行旋转

当parent.bf==-2的时候,说当前这棵树已经不平衡了,说明此时左树高,说明要降低左树的高度,增加右树的高度,所以要进行旋转

左旋说明右树高,右旋说明左树高

一)parent节点的平衡因子是2,current节点存储的平衡因子是1:

二)parent结点的平衡因子是2,current的节点的平衡因子是-1;
三)parent结点存储的平衡因子是-2,current存储结点的平衡因子是-1;

1)这个旋转也叫做右单旋,除了修改指针的指向还有修改平衡因子,右单旋就是自己变成左孩子的右孩子

2)但是代码写到这里面还是存在着一定问题,可能当前的parent是上面某一棵树的左子树,也有可能是某一棵树的右子树

3)最后修改各个节点的平衡因子

4)但是上面的所有情况都考虑得比较不错了,但是最终的代码还是存在着一定的瑕疵

四)parent存储结点的平衡因子是-2,current存储结点的平衡因子是1;  

右单旋:(新节点插入较高左子树的右侧)

左旋——自己变为右孩子的左孩子;右旋——自己变为左孩子的右孩子

 

 在上面的代码中,我们就成功地进行了右旋;

左单旋:新节点插入较高右子树的右侧

左右双旋:新节点插入到较高左子树的右侧

解决方案:先针对parent的左子树进行左旋,再根据parent结点进行右旋,再进行更新平衡因子的变化

右左双旋:新节点插入到较高右子树的左侧

验证AVL树:中序遍历有序况且是平衡二叉树

http://www.lryc.cn/news/158436.html

相关文章:

  • 北斗高精度组合导航终端
  • 低代码平台是否能替代电子表格?
  • qt多个信号如何关联一并处理
  • 【python爬虫】12.建立你的爬虫大军
  • 2023数学建模国赛C题思路--蔬菜类商品的自动定价与补货决策
  • vue2与vue3的使用区别
  • Apache httpd漏洞复现
  • 【漏洞复现】时空智友企业流程化管控系统文件上传
  • elasticsearch的DSL查询文档
  • IP地址、子网掩码、网络地址、广播地址、IP网段
  • ffmpeg-android studio创建jni项目
  • 智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”
  • JVM中JAVA对象和数组内存布局
  • 【2023年数学建模国赛】赛题发布
  • Java HashMap源码学习
  • Gin中用于追踪用户的状态的方法?!!!
  • HTTP代理与HTTPS代理在工作流程上有哪些区别
  • Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups
  • 算法的概述
  • 菜鸟教程《Python 3 教程》笔记(19):错误与异常
  • 空气净化器上亚马逊美国站需要办理什么认证?空气净化器UL867测试报告如何办理?
  • SpringBoot的测试方案
  • 华为OD机考算法题:字符串解密
  • unity 锚点设置
  • Hadoop:HDFS--分布式文件存储系统
  • 自定义封装异步任务组件,实现FutureTask功能
  • 【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置
  • 【autodesk】浏览器中渲染rvt模型
  • Python超入门(1)__迅速上手操作掌握Python
  • 后端面试话术集锦第 十四 篇:go语言面试话术