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

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

一、平衡二叉树


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

相关文章
|
2月前
|
数据采集 机器学习/深度学习 算法
|
2月前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
4天前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
11天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
27 4
|
8天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
20 1
|
28天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
14天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
20 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
2月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
24天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
1月前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
下一篇
无影云桌面