07-7.3.2 平衡二叉树(AVL)

👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com


喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

定义

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树)
树上任一结点的左子树和右子树的高度之差不超过 1
结点的平衡因子 = 左子树高 - 右子树高
平衡因子只可能是: 0 , ∣ 1 ∣ 0,|1| 0,∣1∣

插入

每次调整的对象都是“最小不平衡子树
在插入操作中,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡

调整最小不平衡子树

LL:在A的左孩子的左子树中插入导致不平衡

目标:

  1. 恢复平衡
  2. 保持二叉排序树特性

方法:
LL平衡旋转(右单旋转)。由于在结点A的左孩子(L)的左子树(L)上插入了新节点,A的平衡因子由 1 增至 2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。将A的左孩子B向右上旋转代替A称为根结点,将A结点向右下旋转称为B的右子树的根结点,而B的原右子树则作为A结点的左子树

RR:在A的右孩子的右子树中插入导致不平衡

左旋

LL 和 RR 的代码思路

右旋
实现 f 向右下旋转,p 向右上旋转,其中 f 是 爹,p 为左孩子, gf 为 f 他爹

  1. f->lchild = p->rchild
  2. p->rchild = f
  3. gf->lchild/rchild = p

左旋
实现 f 向左下旋转,p 向左上旋转,其中 f 是 爹,p 为左孩子, gf 为 f 他爹

  1. f->rchild = p->lchild
  2. p->lchild = f
  3. gf->lchild/rchild = p

LR:在A的左孩子的右子树中插入导致不平衡

pass

RL:在A的右孩子的左子树中插入导致不平衡

pass

练习

1

![[Pasted image 20240708165535.png]]

2

![[Pasted image 20240708165723.png]]

3

![[Pasted image 20240708165834.png]]

查找效率分析

若树高为 h,最坏情况下,查找一个关键字最多需要对比 h 次,即查找操作时间复杂度不可能超过 O ( h ) O(h) O(h)

平衡二叉树最大深度为 O ( l o g 2 n ) O(log_2n) O(log2n) ,平均查找长度/查找的时间复杂度为 O ( l o g n ) O(log n) O(logn)

插入和删除

插入:

  • 插入新节点后,要保持二叉排序树的特性不变(左 < 中 < 右)
  • 若插入新节点导致不平衡,则需要调整平衡

删除:

  • 删除节点后,要保持二叉排序树的特性不变(左 < 中 < 右)
  • 若删除节点导致不平衡,则需要调整平衡

删除操作具体步骤:

  1. 删除节点
    • 若删除的节点是叶子结点,直接删
    • 若删除的节点只有一个子树,用子树顶替删除位置
    • 若删除的节点有两棵子树,用前驱(或后继)结点顶替,并转换为对前驱(后继)结点的删除
  2. 一路向上找到最小不平衡子树,找不到就结束
  3. 找最小不平衡子树下,“个头”最高的儿子孙子
  4. 根据孙子的位置,调整平衡(LL、RR、LR、RL)
    • 孙子在LL:儿子右单旋
    • 孙子在RR:儿子左单旋
    • 孙子在LR:孙子先左旋,再右旋
    • 孙子在RL:孙子先右旋,再左旋
  5. 如果不平衡向上传导,继续②
    • 对最小不平衡子树的旋转可能导致树变矮,从而导致上层祖先不平衡

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 Qt 和 ECharts 进行数据可视化

文章目录 示例图表预览折线图散点图柱状图使用 Qt 和 ECharts 进行数据可视化一、准备工作1. 安装 Qt2. 准备 ECharts二、在 Qt 中使用 ECharts1. 创建 Qt 项目2. 配置项目文件3. 在 UI 中添加 WebEngineView4. 加载 ECharts三、创建折线图、散点图和柱状图1. 折线图2. 散点图3…

工作流之战: Flowable vs. Camunda vs. Activiti

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 工作流之战: Flowable vs. Camunda vs. Activiti 前言功能特性对比架构设计分析性能比较使用场景…

zookeeper加入开机启动项

Windows的任务计划程序&#xff08;Task Scheduler&#xff09;是一个强大的工具&#xff0c;允许你安排程序在特定时间自动运行&#xff0c;包括开机时。 打开任务计划程序&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框。输入taskschd.msc并回车&#xff0c;打开…

js ES6 part1

听了介绍感觉就是把js在oop的使用 作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问&#xff0c; 作用域分为&#xff1a; 局部作用域、 全局作用域 1. 函数作用域&#xff1a; 在函数内部声明的…

Docker定时清理

一、循环调度执行 1、检查cron状态 systemctl status crond 2、创建要执行的shell脚本 vim /home/cleanup_docker.sh #! /bin/bash # 清理临时文件 echo $(date "%H:%M:%S") "执行docker清理命令..." docker system prune -af-a 清理包括未使用的镜像 …

Vue3动态路由(响应式带参数的路由)变更页面不刷新的问题

背景 先说说问题&#xff0c;问题来源是因为我的开源项目Maple-Boot项目的网站前端&#xff0c;因为项目主打的内容发布展示&#xff0c;所以其中的内容列表页会根据不同的菜单进行渲染不同的路由。 这里路由path使用的是/blog/:menu?&#xff0c;通过menu的参数来渲染对应的…

很多人对AI Agent的理解太片面

现在 AI 智能体&#xff08;AI Agent&#xff09;的概念很火&#xff0c;似乎 Agent 是用 AI 解决问题的银弹&#xff0c;有了 Agent 就可以解决很多问题。但也有很多人有不同意见&#xff0c;认为 Agent 不过是噱头&#xff0c;并没有看到靠谱的应用场景。 一个被提及很多的是…

openlayers更改点坐标

我现在的需求是无人机点位根据ws传输的经纬度改变位置&#xff0c;在网上查了很多资料&#xff0c;终于是做出来了&#xff0c;如果有问题请指出。 效果图&#xff0c;无人机可以来回移动 这里是核心代码 // 添加飞机点位图层let vectorLayerpointfunction DronepointLayer()…

Windows远程桌面的奇技淫巧

前言 Windows远程桌面简介 远程桌面协议(RDP)是一个多通道(multi-channel)的协议&#xff0c;让使用者连上提供微软终端机服务的计算机(称为服务端或远程计算机) 远程桌面的前置条件 在获取权限后&#xff0c;针对3389进行展开&#xff0c;先查询3389端口是否开启 netstat…

PHP工单预约表单系统小程序源码

&#x1f527;【高效办公新利器】工单预约表单系统大揭秘 &#x1f4bc;【一键提交&#xff0c;工单管理新高度】 你还在为繁琐的工单提交流程头疼吗&#xff1f;工单预约表单系统&#xff0c;让你的工单管理步入高效时代&#xff01;只需简单几步&#xff0c;填写必要信息&a…

记一次线上流量突增问题排查

一.问题 接流量告警出现获取 xx 信息接口调用次数同比往年大促活动猛涨.扩大至 10 倍之多.心里顿时咯噔一下.最近各种严打,顶风作案.某不是摸到电门了.一下子要把自己带走.从此走向求职之路.一时间脑子哇哇的思绪万千. 202x.5.20 大促开门红的调用.这个是往年活动的时候的调用…

app: 和 android:的区别

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Dynadot 2024年第一季度回顾

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

顶刊文献阅读及代码复现

前提:每个无人机都有 (i)自己的机载计算机,用于执行控制其自身动作所需的计算 (ii)自己的传感器系统,用于测量相对位置和速度, (iii)自己的通信设备,用于与相邻代理进行数据交换。 模型:短期的排斥力、中间范围的速度一致性和长距离的吸引力

昇思MindSpore学习入门-CELL与参数一

Cell作为神经网络构造的基础单元&#xff0c;与神经网络层(Layer)的概念相对应&#xff0c;对Tensor计算操作的抽象封装&#xff0c;能够更准确清晰地对神经网络结构进行表示。除了基础的Tensor计算流程定义外&#xff0c;神经网络层还包含了参数管理、状态管理等功能。而参数(…

【LLM大模型】如何在LlamaIndex中使用RAG?

如何在LlamaIndex中使用RAG 什么是 Llama-Index LlamaIndex 是一个数据框架&#xff0c;用于帮助基于 LLM 的应用程序摄取、构建结构和访问私有或特定领域的数据。 如何使用 Llama-Index ? 基本用法是一个五步流程&#xff0c;将我们从原始、非结构化数据导向基于该数据生成…

1Panel安装教程:使用Linux服务器安装1Panel面板全流程

使用阿里云服务器安装1Panel面板全流程&#xff0c;云服务器操作系统为CentOS 7.9&#xff0c;安装1Panel非常简单&#xff0c;先执行1Panel安装命令&#xff0c;然后在云服务器安全组中开通1Panel默认端口号、安全入口、用户名和密码等操作&#xff0c;阿里云百科整理详细安装…

国产热玛吉射频仪

最近看到国产热玛吉的射频模块。分享一下图片&#xff0c;看起来做工也是普普通通&#xff0c;对比进口的热玛吉射频板&#xff0c;技术水平相差甚远啊

django基于个人BMI的健康饮食食谱推荐系统-计算机毕业设计源码26624

目 录 1 绪论 1.1 研究背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3经济可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4系统流程分…

孟德尔随机化与痛风

写在前面 今天阅读的文献是多种暴露与某结局的孟德尔随机化&#xff0c;算是以量取胜了。 The effect of metabolism-related lifestyle and clinical risk factors on digestive system cancers in East Asian populations: a two-sample Mendelian randomization analysis …