算法笔记:平衡二叉树
1 介绍
- 平衡二叉树(AVL树)是一种特殊的二叉搜索树(BST),它自动确保树保持低高度,以便实现各种基本操作(如添加、删除和查找)的高效性能。
- ——>时间都维持在了O(logN)
- 它是一棵空树,或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

- 平衡二叉树大部分操作和二叉查找树类似,主要不同在于插入删除的时候平衡二叉树的平衡可能被改变
2 插入
- 把需要重新平衡的结点叫做α(下图中的6)
- 由于任意两个结点最多只有两个儿子,因此高度不平衡时,α结点的两颗子树的高度相差2.
- 容易看出,这种不平衡可能出现在下面4中情况中:
-
1.对α的左儿子的左子树进行一次插入
2.对α的左儿子的右子树进行一次插入
3.对α的右儿子的左子树进行一次插入
4.对α的右儿子的右子树进行一次插入
- 情形1和情形4是关于α的镜像对称,二情形2和情形3也是关于α的镜像对称
- ——>因此理论上看只有两种情况
- 外:左左、右右
- 内:左右、右左
- ——>因此理论上看只有两种情况
-
2.1 单旋转

2.1.1 左旋转
左旋转的基本步骤如下:
- 首先创建一个新节点 ,该节点的值设为根节点的值;
- 新节点的左指针指向根节点的左子树;
- 新节点的右指针指向根节点的右子节点的左子树;
- 将根节点的值设置为根节点的右子节点的值;
- 根节点的左指针指向新节点;
- 根节点的右指针指向其右子节点的右子树。
比如我们插入8:

显然此时不是平衡二叉树,我们进行左旋转调整

于是得到了一棵二叉树
2.1.2 右旋转
右旋转基本步骤如下:
- 首先创建一个新节点,新节点的值设为根节点的值;
- 新节点的右指针指向根节点的右子树;
- 新节点的左指针指向根节点的左子节点的右子树;
- 将根节点的值设为其左子节点的值;
- 根节点的左指针指向其左子节点的左子树;
- 根节点的右指针指向新节点。
比如我们插入一个1

显然此时不是平衡二叉树,我们进行右旋转调整

2.2 双旋转
对于左右和右左两种情况,单旋转不能解决问题,要经过两次旋转

首先以K1为根,做一次左旋转;
然后以K3为根,做一次右旋转
2.2.1 判断是否需要双旋转
双旋转代码的核心思想在于:在创建二叉树的过程中,每次添加新的节点,都要判断一下该二叉树是否需要旋转。
- 如果二叉树需要左旋,则先判断根节点的右子节点的左子树高度是否大于右子树的高度,如果大于则先对根节点的右子树进行右旋,最后再对原二叉树进行左旋;
- 如果二叉树需要右旋,则先判断根节点的左子节点的右子树高度是否大于左子树的高度,如果大于则先对根节点的左子树进行左旋,最后再对原二叉树进行右旋。

3 删除
同插入操作一样,删除结点时也有可能破坏平衡性,这就要求我们删除的时候要判断是否进行平衡性调整
3.1 删除根结点
- 如果左右子树都非空。在高度较大的子树中实施删除操作
-
左子树高度大于右子树高度,将左子树中最大的那个元素赋给当前根节点,然后删除左子树中元素值最大的那个节点
-
左子树高度小于右子树高度,将右子树中最小的那个元素赋给当前根节点,然后删除右子树中元素值最小的那个节点。
-

3.2 删除的时候进行旋转调整

参考内容:平衡二叉树详解 - zhangbaochong - 博客园 (cnblogs.com)
平衡二叉树(AVL树)_RonzL的博客-CSDN博客
相关文章:
算法笔记:平衡二叉树
1 介绍 平衡二叉树(AVL树)是一种特殊的二叉搜索树(BST),它自动确保树保持低高度,以便实现各种基本操作(如添加、删除和查找)的高效性能。 ——>时间都维持在了O(logN)它是一棵空…...
redis 通用命令
目录 通用命令是什么 SET & GET keys EXISTS DEL EXPIRE TTL redis 的过期策略 定时器策略 基于优先级队列定时器 基于时间轮的定时器 TYPE 通过 redis 客户端和 redis 服务器交互。 所以需要使用 redis 的命令,但是 redis 的命令非常多。 通用命令…...
Pycharm配置及使用Git教程
文章目录 1. 安装PyCharm2. 安装Git3. 在PyCharm中配置Git插件4. 连接远程Gtilab仓库5. Clone项目代码6. 将本地文件提交到远程仓库6.1 git add6.2 git commit6.3 git push6.4 git pull 平时习惯在windows下开发,但是我们又需要实时将远方仓库的代码clone到本地&…...
CSS transition 过渡
1 前言 水平居中、垂直居中是前端面试百问不厌的问题。 其实现方案也是多种多样,常叫人头昏眼花。 水平方向可以认为是内联方向,垂直方向认为是块级方向。 下面介绍一些常见的方法。 2 内联元素的水平垂直居中 首先,常见内联元素有&…...
Unity中Shader的UV扭曲效果的实现
文章目录 前言一、实现的思路1、在属性面板暴露一个 扭曲贴图的属性2、在片元结构体中,新增一个float2类型的变量,用于独立存储将用于扭曲的纹理的信息3、在顶点着色器中,根据需要使用TRANSFORM_TEX对Tilling 和 Offset 插值;以及…...
Automotive 添加一个特权APP
Automotive 添加一个特权APP platform: android-13.0.0_r32 一. 添加一个自定义空调的app为例 路径:packages/apps/Car/MyHvac app内容可以自己定义,目录结构如下: 1.1 Android.bp package {default_applicable_licenses: ["Andr…...
自定义TimeLine
自定义TimeLine 什么是TimeLineData(数据)Clip(片段)Track(轨道)Mixer(混合) 什么是TimeLine 在 Unity 中,TimeLine(时间轴)是一种用于创建和管理…...
如何使用SQL系列 之 如何在SQL中使用WHERE条件语句
引言 在结构化查询语言 (SQL)语句中,WHERE子句限制了给定操作会影响哪些行。它们通过定义特定的条件(称为搜索条件)来实现这一点,每一行都必须满足这些条件才能受到操作的影响。 本指南将介绍WHERE子句中使用的通用语法。它还将概述如何在单个WHERE子句…...
leetcode:1941. 检查是否所有字符出现次数相同(python3解法)
难度:简单 给你一个字符串 s ,如果 s 是一个 好 字符串,请你返回 true ,否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 是 好 字符串。 示例 1: 输入:s…...
Echarts 各种点击事件监听
目录 一、鼠标事件1.1、左击1.2、双击1.3、右击1.4、右键双击1.5、中轴滚动二、时间轴2.1、时间轴监听三、拖动3.1、拖动事件一、鼠标事件 1.1、左击 chart.on(click, function(params)...
《智能网联汽车自动驾驶功能测试规程》
一、 编制背景 2018 年4 月12 日,工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》(以下简称《管理规范》),对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…...
NVIDIA CUDA Win10安装步骤
前言 windows10 版本安装 CUDA ,首先需要下载两个安装包 CUDA toolkit(toolkit就是指工具包)cuDNN 1. 安装前准备 在安装CUDA之前,需要完成以下准备工作: 确认你的显卡已经正确安装,在设备管理器中可以看…...
Elasticsearch、Kibana以及Java操作ES 的快速使用
docker 安装elastic search 、 kibana(可视化管理elastic search) docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1创建docker自定义网络 docker自定义网络可以使得容器之间使用容器名网络互连,默认的网络不会有这功能。 一定…...
逐鹿人形机器人,百度、腾讯、小米卷起来
长期不温不火的人形机器人产业迎来新风口,技术显著提升、新品层出不穷、资本投资态度也逐渐好转。 8月18日,2023世界机器人大会博览会正式开放,全面展示了机器人行业的新技术、新产品和新应用。据悉,此次展会展览总面积达4.5万平…...
AndroidStudio推荐下载和配置
1、推荐下载链接 Download Android Studio & App Tools - Android Developers 2、gradle配置案例 // Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {maven { url https://maven.aliyun.…...
mysql异常占用资源排查
通过执行日志与连接信息排查 查看是否开启日志记录 mysql> show global variables like %general%; --------------------------------- | Variable_name | Value | --------------------------------- | general_log | OFF | | general_log_file…...
requests 库:发送 form-data 格式的 http 请求 (python)
安装 requests-toolbelt !pip install requests-toolbeltdemo from requests_toolbelt import MultipartEncoder import requestsm MultipartEncoder(fields{query: """第一,向量化匹配是有能力上限的。搜索引擎实现语义搜索已经是好几年的事情了…...
行测图形推理规律(一)元素组成
题库:粉笔网题库 (fenbi.com) 不知道和测评的行测题库是不是一样的,但是总结的规律应该是一样的。 规律并不唯一,题库的答案也只是参考答案,切勿当杠精,你觉得你的规律更合适就别管。本人所归纳的规律仅代表本人想法…...
【python爬虫】13.吃什么不会胖(爬虫实操练习)
文章目录 前言项目实操明确目标分析过程代码实现 前言 吃什么不会胖——这是我前段时间在健身时比较关注的话题。 相信很多人,哪怕不健身,也会和我一样注重饮食的健康,在乎自己每天摄入的食物热量。 不过,生活中应该很少有人会…...
深入理解联邦学习——联邦学习与现有理论的区别与联系
分类目录:《深入理解联邦学习》总目录 作为一种全新的技术,联邦学习在借鉴一些成熟技术的同时也具备了一定的独创性。下面我们就从多个角度来阐释联邦学习和其他相关概念之间的关系。 联邦学习与差分隐私理论的区别 联邦学习的特点使其可以被用来保护用…...
搞电机控制的兄弟应该都懂,无感算法里磁链观测器+PLL锁相环的组合有多香。今天直接上干货,聊聊非线性磁链观测器的实现套路和实操中那些让你少掉几根头发的技巧
永磁同步电机非线性磁链无感算法、Flux观测器锁相环PLL仿真模型 flux:计算电机磁链,目的为了使得估计的磁链收敛于实际磁链; pll:通过估计磁链计算经过pi调节后使得估计角度跟踪实际角度 模型描述及资料: (…...
家庭教育小帮手:OpenClaw+Kimi-VL-A3B-Thinking自动批改孩子手写作业
家庭教育小帮手:OpenClawKimi-VL-A3B-Thinking自动批改孩子手写作业 1. 为什么需要自动化作业批改? 作为一名经常辅导孩子作业的家长,我深刻体会到手工批改作业的痛点。每天晚上检查数学题时,既要核对答案正确性,又要…...
保姆级教程:在Vitis HLS 2022.2中配置Vision库和OpenCV 4.4.0(附完整编译参数)
从零搭建Vitis HLS视觉加速开发环境的实战指南 在FPGA加速领域,Vitis HLS配合Vision库的组合正成为计算机视觉算法硬件化的首选方案。但对于刚接触这套工具链的开发者来说,环境配置往往成为第一道门槛——错综复杂的路径设置、晦涩难懂的编译参数、仿真与…...
【设计模式】探索状态模式在现代软件开发中的应
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
云原生时代的前端部署最佳实践
云原生时代的前端部署最佳实践 引言:前端部署的进化 哥们,别整那些花里胡哨的!作为一个前端开发兼摇滚鼓手,我最烦的就是部署时的各种幺蛾子。从传统的FTP上传,到现在的云原生部署,前端部署已经发生了天翻地…...
ESP32/ESP8266轻量级二进制RPC库设计与实践
1. 项目概述esp_rpc是一个专为 ESP8266 和 ESP32 平台深度优化的轻量级远程过程调用(Remote Procedure Call, RPC)库。其设计哲学直指嵌入式资源受限场景的核心矛盾:在极小内存占用(ROM/RAM 双敏感)与可靠跨设备交互之…...
深入解析LM2675电源管理芯片内部架构与设计原理
1. 芯片内部电路设计概述作为一名从业十年的芯片设计工程师,我经常遇到同行对芯片内部结构一知半解的情况。很多人拿到新芯片后直接翻到Datasheet的应用电路部分,按推荐设计搭建外围电路就完事。这种做法虽然能快速实现功能,却错失了深入理解…...
Health Agent开放平台:企业级健康医疗AI Agent基础设施
在人工智能加速渗透各行各业的今天,健康医疗领域正迎来由智能体驱动的深刻变革。面向专业场景的健康医疗AI Agent,正成为企业提升服务效能、优化运营流程、构建差异化竞争力的核心引擎。而集专业性、灵活性与可扩展性于一体的企业级智能体平台࿰…...
第4章 Mosquitto命令行工具快速上手
第4章 Mosquitto命令行工具快速上手 4.1 命令行工具概览 #mermaid-svg-J8aIvd39QR9TuYWA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-…...
基于九轴传感器 + K-means 聚类的振动异常检测实战教程
(嵌入式 / 工业监测场景:设备振动、电机故障、结构松动、碰撞异常实时检测)一、前言(你能学到什么)这篇文章不讲虚的,直接带你做一个工业级轻量异常检测系统:用 LSM6DS3TR-C(6 轴&am…...

