【数据结构】二叉查找树和平衡二叉树,以及二者的区别

news2024/11/24 5:35:08

目录

1、二叉查找树

1.1、定义

 1.2、查找二叉树的优点

 1.2、查找二叉树的弊端

2、平衡二叉树

2.1、定义

2.2、 实现树结构平衡的方法(旋转机制)

2.2.1、左旋

2.2.2、右旋

3、总结

1、二叉查找树

       二叉查找树又名二叉排序树,亦称二叉搜索树。是每个结点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。

1.1、定义

二叉查找树的定义:

  1. 若左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 左、右子树也分别为二叉排序树;
  4. 没有键值相等的节点。

 1.2、查找二叉树的优点

普通二叉树和二叉查找树示例图如下所示:

       上图中左边为普通二叉树,它的弊端是对数据的插入没有要求,在进行数据的查找时就非常的麻烦,因为它里面的数据没有什么规律让我们进行查找。普通的二叉树如果想要查找数据的话就只能进行遍历,查找的效率非常的低。

        所以就有了上图中右边的二叉查找树,因为二叉查找树插入数据的时的规律是:小的存左边;大的存右边;一样的不存,并且它在查找数据的时候也是按照这个规律来进行查找的

 1.2、查找二叉树的弊端

现有数字{ 3,6,7,9,10,11,12 } ,基于这些数字生成二叉查找树如下:

这时候看起来二叉树的结构是很均匀的排列的,但是当依次插入13,14数据后,如下图:

       这时候发现,由于二叉树的根节点是确定不变的,所以当调整数据的插入或删除顺序,会造成二叉树朝着单项链表的方向发展(张歪了,变成歪脖子树了),大大降低了数据的查询效率。一棵树要提高查询效率,左右的高度要差不多才可以。那问题是在添加节点的时候,如何保证把它变成左右高度差不多长的这种树呢?这时候就出现了下面的平衡二叉树。

2、平衡二叉树

平衡二叉树是基于二叉查找树优化而来的。

2.1、定义

       非叶子结点最多只能有两个子结点,且左边子结点点小于当前结点值,右边子结点大于当前结点树,并且为保证查询性能增增删结点时要保证左右两边结点层级相差不大于1,具体实现有AVL、Treap、红黑树等。Java中TreeMap就是基于红黑树实现的。

       也就是说平衡二叉树是在二叉查找树的基础上又多了一个规则:任意节点左右子树高度差不超过1。

判断是否为平衡二叉树示例: 

示例1:

 

      上图中的二叉树是一个查找二叉树,但不是平衡二叉树。虽然根节点7左子树高度为3右子树高度为4,左右子树高度差不超过1。但平衡二叉树是需要任意节点都满足这个规则,比如节点10就不满足这个规则,节点10的左子树高度为0,右子树高度为3,左右子树高度差明显超过1了,所以它不是平衡二叉树。

示例2: 

 

       上图中的二叉树是一个平衡二叉树,因为它满足查找二叉树的同时还满足了规则:任意节点左右子树高度差不超过1。

2.2、 实现树结构平衡的方法(旋转机制)

        旋转机制右两种,分别是左旋和右旋。旋转机制的触发时机为:当添加一个节点之后,该树不再是一颗平衡二叉树时

2.2.1、左旋

左旋的步骤

先确定支点:从添加的节点开始,不断的往父节点找不平衡的节点

找到不平衡的节点后:

        (1)若不平衡的节点没有左子树,以不平衡的点作为支点,把支点左旋降级,变成左子节点,晋升原来的右子节点

        (2)若不平衡的节点有左子树,以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

左旋示例

示例1:

上图中左边的平衡二查树添加了节点12后,变成了右边的结构,这时候平衡被破坏了,所以要进行旋转。

先确定支点:从添加的节点12开始,不断的往父节点找不平衡的节点。我们发现节点10的左子树高度为0,右子树高度为2,所以找到不平衡的节点10。

找到不平衡的节点:不平衡的节点10没有左子树,以不平衡的点作为支点,把支点左旋降级,变成左子节点,晋升原来的右子节点

如下图所示:

通过左旋后就保持平衡了,还是一个平衡二叉树 

示例2:

上图中左边的平衡二查树添加了节点12后,变成了右边的结构,这时候平衡被破坏了,所以要进行旋转。

先确定支点:从添加的节点12开始,不断的往父节点找不平衡的节点。我们发现节点7的左子树高度为1,右子树高度为3,所以找到不平衡的节点7。

找到不平衡的节点:不平衡的节点7有左子树,以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

如下图所示:

 通过左旋后就保持平衡了,还是一个平衡二叉树 

2.2.2、右旋

右旋的步骤

先确定支点:从添加的节点开始,不断的往父节点找不平衡的节点

找到不平衡的节点后:

        (1)若不平衡的节点没有右子树,以不平衡的点作为支点,把支点右旋降级,变成右子节点,晋升原来的左子节点

        (2)若不平衡的节点有左子树,以不平衡的点作为支点,将根节点的左侧往右拉,原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点

右旋示例

示例1: 

上图中左边的平衡二查树添加了节点1后,变成了右边的结构,这时候平衡被破坏了,所以要进行旋转。

先确定支点:从添加的节点1开始,不断的往父节点找不平衡的节点。我们发现节点4的左子树高度为2,右子树高度为0,所以找到不平衡的节点4。

找到不平衡的节点:不平衡的节点4有左子树,以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

如下图所示:

  通过右旋后就保持平衡了,还是一个平衡二叉树 

示例2: 

上图中左边的平衡二查树添加了节点1后,变成了右边的结构,这时候平衡被破坏了,所以要进行旋转。

先确定支点:从添加的节点1开始,不断的往父节点找不平衡的节点。我们发现节点7的左子树高度为3,右子树高度为1,所以找到不平衡的节点7。

找到不平衡的节点:不平衡的节点7有左子树,以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

如下图所示:

  通过右旋后就保持平衡了,还是一个平衡二叉树 

3、总结

相同点:都是基于分治思想采用二分法的策略提高数据查找速度的二叉树结构。

不同点:

  1. 二叉查找树的根节点是不可变的,左右两边结点层级差没有限制;
  2. 平衡二叉树左右两边结点层级相差不大于1,通过旋转实现根节点可变,达到自平衡。

相对于二叉查找树,平衡二叉树的查询效率高,但由于增加和删除节点时,为了保证自平衡会做连续的旋转操作,平衡二叉树的额外开销比较大,耗时相对较长。

推荐:

【数据结构】前缀树的模拟实现-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136086068?spm=1001.2014.3001.5501

【计算机组成原理】存储器知识-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134770339?spm=1001.2014.3001.5501

java数据结构(哈希表—HashMap)含LeetCode例题讲解_leetcode hashmap.values()-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/134712832?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java程序员面试专栏 Java领域】Java虚拟机 核心面试指引

关于Java 虚拟机部分的核心知识进行一网打尽,主要包括Java虚拟机的内存分区,执行流程等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 JVM 程序执行流程 包括Java程序的完整执行流程,以及Javac编译,JIT即时编译 Java程序的完整执…

2024年【A特种设备相关管理(电梯)】找解析及A特种设备相关管理(电梯)模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 A特种设备相关管理(电梯)找解析是安全生产模拟考试一点通生成的,A特种设备相关管理(电梯)证模拟考试题库是根据A特种设备相关管理(电梯&#xff…

NBA2K24 精品蔡徐坤面补

NBA2K24 精品蔡徐坤面补 NBA2K23-NBA2K24通用 精品蔡徐坤面补 下载地址: https://www.changyouzuhao.cn/13072.html

【JavaEE】_HTTP请求报头header

目录 1. Host 2. Content-Length与Content-Type 2.1 Content-Length 2.2 Content-Type 3. User-Agent(UA) 4. Referer 5. Cookie header的整体格式是“键值对”结构,一行是一个键值对,这些键值对都是HTTP定义好的、有特殊含…

【STM32 CubeMX】SPI W25Q64功能实现

文章目录 前言一、内部函数的实现1.1 选中和取消选中SPI Flash1.2 写使能函数1.3 获取读状态1.4 等待就绪状态 二、Flash读写函数实现2.1 读Flash ID2.2 擦除某个扇区2.3 写扇区2.4 读数据 三、测试代码总结 前言 SPI Flash 存储器在嵌入式系统中扮演着重要角色,它…

各类有关于花卉的深度学习数据集

花卉的识别和分类在深度学习过程中是最常见的使用的案例,因此各类有关花卉分类、识别、计数的图像数据集是大家都常用的数据集。最近收集到各类有关花卉的各类数据集分享给大家!! 1、16种花常见的图像数据集 数据说明:我们看到我…

数据库设计、JDBC、数据库连接池

数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…

企业计算机服务器中了faust勒索病毒怎么办?Faust勒索病毒解密数据恢复

网络技术的不断发展与更新,为企业的生产运营提供了极大便利,但也为企业的数据安全埋下隐患。近期,云天数据恢复中心接到很多企业的求助,企业的计算机服务器遭到了faust勒索病毒攻击,给企业的生产运营带来了极大困扰&am…

使用新的 AI 工具和生产力工具提升 Windows 上的开发人员体验

随着 9 月 26 日最新的 Windows 11 更新,我们发布了一系列开发人员功能作为 Windows 操作系统的核心组件,旨在提高每个开发人员在 Windows 上的工作效率。今天,我们很高兴地宣布推出 Windows AI Studio,这是一种新的 AI 体验&…

SCI文章复现 | GEO文章套路,数据下载和批次效应处理

原文链接: SCI文章复现 | GEO文章套路,数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程,我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址:关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容: 前言 我在上一篇关于DDOS的文章种提到过这个项目,而且说明了由于这个项目是在2020年发布并开源的,并且已经有两年没有进行跟…

C++入门学习(二十八)跳转语句—continue语句

当在循环中遇到continue语句时,它会跳过当前迭代剩余的代码块,并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤,而不是完全终止循环。 直接看一下下面的代码更清晰: 与上一节的break语句可以做一下对比…

spring boot3登录开发-2(1图形验证码接口实现)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 内容简介 图形验证码接口实现 导入糊涂工具依赖 接口分析 编写验证码接口 测试验证码接口 前置条件 …

【MySQL进阶之路】MySQL中到底为什么会出现幻读?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

第六篇【传奇开心果系列】Python微项目技术点案例示例:庖丁解牛tkinter.ttk库gui界面编程

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录前言一、主窗口和子窗口创建和切换,以员工信息管理系统示例代码二、主窗口添加有菜单项图标的菜单栏、工具栏和右键菜单示例代码三、使用sqlite3数据库增删改查管理员工信息示例代码四、在主…

从物联网到数字孪生:智慧社区的演变

随着科技的飞速发展和数字化转型的深入推进,智慧社区已成为提升城市治理水平和居民生活质量的重要方向。在这一演变过程中,物联网和数字孪生技术起到了至关重要的作用。本文将深入探讨从物联网到数字孪生的演变过程,分析这一转变对智慧社区建…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件,没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本,熟悉了新版本一些好用的操作,Fl Studio就又推出了更新的版本,而且F…

基于springboot大学生租房系统源码和论文

伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于各大行业,大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本,使整个大学生租房的发展和服务水平有显著提升。 本论文主要面…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱:py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型,所以颜色相同,无法相互区分歌手、歌曲还是专辑等等。 py2ne…

解决STM32MP157开发板密码登录问题

开发板密码登录问题是很多人遇到的问题,网上有很多帖子,我也参考过,不太适用,很复杂,甚至会被误导,我差点连ubuntu虚拟机都无法登录了。有的密码匹配,有的取消不了密码。 1、密码配置&#xff…