【数据结构】动态查找—平衡二叉树的概述和算法分析

简介: 【数据结构】动态查找—平衡二叉树的概述和算法分析

一、平衡二叉树


1)概述


二叉排序树的查找效率与二叉树的形状有关


1. 对于按给定序列的二叉排序树,若其左、右子树均匀分布,则查找过程类似于有序表的二分查找,时间复杂度为O(log2n)


2. 若给定序列原来有序,则建立的二叉排序树就蜕化为单链表,其查找效率同顺序查找一样,时间复杂度为O(n)


在构造二叉排序树的过程中,当出现左右子树分布不均匀时,若能对其进行调整,使其依然保持均匀,则就能有效的保证二叉排序树仍具有较高的查找效率。


平衡二叉树,是一个特殊的二叉排序树,左右子树分布均匀的二叉排序树。


2)定义


平衡二叉树 Balanced Binary Tree ,又称为AVL树


它或是一棵空树


或是一棵具有下列性质的二叉树:


它的左子树和右子树都是平衡二叉树


且左子树和右子树的深度之差的绝对值不超过1


结点的平衡因子:该结点的左子树深度与右子树深度之差。又称为平衡度。


平衡二叉树也就是树中任意结点的平衡因子的绝对值小于等于1的二叉树。


在AVL树中的结点平衡因子可能有3种取值:-1、0、1。


df4d60db30e04e04b007c7035f3763d0.png


3)平衡化调整


在平衡二叉树上,插入或删除结点后,可能导致树不平衡,需要通过旋转让树重新变平衡。


失去平衡的二叉树共有4种旋转方式使其保持平衡:


LL型平衡旋转(单向右旋)


RR型平衡旋转(单向左旋)


LR型平衡旋转(先左旋后右旋)


RL型平衡旋转(先右旋后左旋)


0bd7271382094aebb679dea99930807d.png


方式1:LL型平衡旋转(单向右旋)


3186a66ed9dd42e08f561656e75bab72.png


方式2:RR型平衡旋转(单向左旋)


7578147786f04f919fd4b7e6e004374c.png


方式3:LR型平衡旋转(先左旋后右旋)


ff5256b0c3c64d9e8109dedf93efc8c1.png


方式4:RL型平衡旋转(先右旋后左旋)


f0e062db54b444f3b158ef5622dac639.png


4)实例


以关键字 5,4,2,8,6,9 构造一颗平衡二叉树


85800df311f24bfcb1587532e7d86a03.png


5)性能分析


在平衡树上进行查找的过程和二叉排序树相同,因此,查找过程中和给定值进行比较的关键字的个数不超过平衡树的深度。


平衡二叉树上进行查找的时间复杂度为O(log2n)。


6)练习


练习1:构造一颗平衡二叉树


16, 15, 50, 53, 64, 7


9c16e7d0072b46c093342156eb40a868.png


练习2:构造一颗平衡二叉树


2,5,8,3,6,9,1,4,7


0416c6b114ca4d32a7e4e67ca53d19a6.png


练习3:构造一颗平衡二叉树


1,2,3,4,5,6,7


dc182581722a469eba800e6b3b827240.png


练习4:构造一颗平衡二叉树


20,16,8,32,24,39,45


415706691f644100bda75cc1e1247105.png

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
24 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
29天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
32 4
|
1月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
27 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
1月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
19 0
数据结构与算法学习十四:常用排序算法总结和对比
|
1月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
29 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
2月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法