当前位置: 首页 > news >正文

Python算法——平衡二叉树(AVL)

Python中的平衡二叉搜索树(AVL树)算法详解

平衡二叉搜索树(AVL树)是一种自平衡的二叉搜索树,它通过在插入或删除节点时进行旋转操作来保持树的平衡性。在AVL树中,任何节点的两个子树的高度差(平衡因子)最多为1。这种平衡性质确保了AVL树的高度始终是对数级别,使得查找、插入和删除等操作的时间复杂度保持在O(log n)。在本文中,我们将深入讨论AVL树的原理,并提供Python代码实现。

AVL树的节点定义

首先,我们定义AVL树的节点类:

class AVLNode:def __init__(self, key):self.key = keyself.height = 1self.left = Noneself.right = None

AVL树的节点除了包含值之外,还记录了节点的高度。这个高度信息是维持平衡的关键。

插入操作

插入操作是在AVL树中插入新节点的过程,同时需要保持树的平衡。插入后,我们需要更新节点的高度,并进行旋转操作来恢复平衡。

def insert(root, key):if root is None:return AVLNode(key)if key < root.key:root.left = insert(root.left, key)elif key > root.key:root.right = insert(root.right, key)# 更新节点的高度root.height = 1 + max(get_height(root.left), get_height(root.right))# 获取平衡因子balance = get_balance(root)# 进行旋转操作来恢复平衡# 左旋if balance > 1 and key < root.left.key:return rotate_right(root)# 右旋if balance < -1 and key > root.right.key:return rotate_left(root)# 左右双旋if balance > 1 and key > root.left.key:root.left = rotate_left(root.left)return rotate_right(root)# 右左双旋if balance < -1 and key < root.right.key:root.right = rotate_right(root.right)return rotate_left(root)return root

删除操作

删除操作是在AVL树中删除节点的过程,同时需要保持树的平衡。删除后,我们需要更新节点的高度,并进行旋转操作来恢复平衡。

def delete(root, key):if root is None:return rootif key < root.key:root.left = delete(root.left, key)elif key > root.key:root.right = delete(root.right, key)else:# 节点有一个或没有子节点if root.left is None:return root.rightelif root.right is None:return root.left# 节点有两个子节点,找到右子树的最小节点root.key = find_min(root.right).key# 删除右子树的最小节点root.right = delete(root.right, root.key)# 更新节点的高度root.height = 1 + max(get_height(root.left), get_height(root.right))# 获取平衡因子balance = get_balance(root)# 进行旋转操作来恢复平衡# 左旋if balance > 1 and get_balance(root.left) >= 0:return rotate_right(root)# 右旋if balance < -1 and get_balance(root.right) <= 0:return rotate_left(root)# 左右双旋if balance > 1 and get_balance(root.left) < 0:root.left = rotate_left(root.left)return rotate_right(root)# 右左双旋if balance < -1 and get_balance(root.right) > 0:root.right = rotate_right(root.right)return rotate_left(root)return root

辅助函数

为了实现插入和删除操作,我们需要一些辅助函数:

def get_height(node):if node is None:return 0return node.heightdef get_balance(node):if node is None:return 0return get_height(node.left) - get_height(node.right)def rotate_left(z):y = z.rightT2 = y.left# 执行左旋y.left = zz.right = T2# 更新节点的高度z.height = 1 + max(get_height(z.left), get_height(z.right))y.height = 1 + max(get_height(y.left), get_height(y.right))return ydef rotate_right(y):x = y.leftT2 = x.right# 执行右旋x.right = yy.left = T2# 更新节点的高度y.height = 1 + max(get_height(y.left), get_height(y.right))x.height = 1 + max(get_height(x.left), get_height(x.right))return x

示例

创建一个AVL树并演示插入和删除操作:

# 创建空树
avl_root = None# 插入操作
keys_to_insert = [50, 30, 70, 20, 40, 60, 80]
for key in keys_to_insert:avl_root = insert(avl_root, key)# 中序遍历查看结果
def inorder_traversal_avl(root):if root is not None:inorder_traversal_avl(root.left)print(f"({root.key}, {get_balance(root)})", end=" ")inorder_traversal_avl(root.right)print("中序遍历结果:", end=" ")
inorder_traversal_avl(avl_root)# 删除操作
delete_key = 30
avl_root = delete(avl_root, delete_key)print("\n删除节点 30 后中序遍历结果:", end=" ")
inorder_traversal_avl(avl_root)
输出结果:
中序遍历结果: (20, 1) (30, 0) (40, 0) (50, -1) (60, 0) (70, 0) (80, 0) 
删除节点 30 后中序遍历结果: (20, 1) (40, 0) (50, 0) (60, 0) (70, 0) (80, 0) 

这表示插入和删除操作都能够保持AVL树的平衡。AVL树通过自平衡的方式,保证了树的高度始终是对数级别,使得查找、插入和删除等操作的时间复杂度保持在O(log n)。通过理解其原理和实现,您将能够更好地应用AVL树解决实际问题。

相关文章:

Python算法——平衡二叉树(AVL)

Python中的平衡二叉搜索树&#xff08;AVL树&#xff09;算法详解 平衡二叉搜索树&#xff08;AVL树&#xff09;是一种自平衡的二叉搜索树&#xff0c;它通过在插入或删除节点时进行旋转操作来保持树的平衡性。在AVL树中&#xff0c;任何节点的两个子树的高度差&#xff08;平…...

公开可用的API 合集

这是一个开源项目列表&#xff0c;收录了一些公开可用、无需注册或认证即可使用的API接口。 这个项目解决了开发者们在寻找合适的API时遇到的各种困难&#xff0c;如无法快速定位、难以筛选等问题&#xff0c;为他们提供了便捷的一站式查询服务。 项目是“public-apis”&…...

单片机编程原则

多任务编程的概念 方式一&#xff1a;实时操作系统&#xff08;不建议新手使用&#xff09; 方式二 &#xff1a;裸机多任务模型 逻辑多任务的基本原理 把三个任务分别分为一个一个的片段 然后先执行任务一的第一个切片 执行第二个任务的第一个片段 执行第三个任务的第一个片…...

开源短剧付费变现小程序源码系统+在线开通会员+在线充值 带完整的搭建教程

说起微短剧&#xff0c;相信大家都不会陌生。相比传统网剧冗长的剧情&#xff0c;微短剧最大的看点&#xff0c;是时长短、高浓缩&#xff0c;顺应了当下用户娱乐时间碎片化趋势。其故事题材多为赘婿、霸道总裁、穿越、重生等看似夸张、无厘头&#xff0c;但却非常“上头”的虚…...

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…...

电商平台为什么需要及时部署ssl证书?

电商平台为什么需要及时部署ssl证书&#xff1f; 21世纪以来&#xff0c;互联网技术得到了快速的发展和应用上的普及&#xff0c;为生活、工作、学习都带来了巨大的变化。现代社会中&#xff0c;快节奏的生活让人们的购物方式也发生了极大的转变&#xff0c;逐渐由线下转为了线…...

卡码网语言基础课 | 12. 位置互换

通过本次练习&#xff0c;将要学习到以下C知识点&#xff1a; 位置互换交换变量字符串 题目&#xff1a;给定一个长度为偶数位的字符串&#xff0c;请编程实现字符串的奇偶位互换。 奇偶位互换是指字符串的奇数位和偶数位相互交换位置 即&#xff1a;第一位和第二位交换&…...

用DOM来读取XML时要注意的一些概念

2023年11月15日&#xff0c;周三下午 在 DOM&#xff08;文档对象模型&#xff09;中&#xff0c;有一些重要的概念和术语&#xff1a; 文档对象&#xff08;Document Object&#xff09;&#xff1a;表示整个 XML 文档的根节点&#xff0c;它是 DOM 树的入口点。元素节点&…...

openresty安装配置,执行shell脚本

下载并解压 OpenResty 源代码&#xff1a; bashCopy code wget https://openresty.org/download/openresty-1.19.9.1.tar.gz tar -zxvf openresty-1.19.9.1.tar.gz cd openresty-1.19.9.1 运行 ./configure 并指定安装路径&#xff1a; bashCopy code ./configure --prefix…...

解决Dockerfile中 Could not initialize class sun.awt.X11FontManager错误

Dockerfile中增加命令 RUN yum install dejavu-sans-fonts fontconfig -y如果您使用的是基于Alpine Linux的发行版&#xff0c;可以使用apk命令来安装DejaVu Sans字体和fontconfig工具 RUN apk update RUN apk add ttf-dejavu fontconfig...

Kubernetes(k8s)进阶

文章目录 Kubernetes进阶一、Namespace&#xff08;名称空间&#xff09;1.namespace介绍2.管理namespace查看namespace创建namespaceyaml文件配置namespace 二、Pod&#xff08;最小基本部署单元&#xff09;1.pod介绍2.管理pod创建并运行pod查看pod信息访问pod删除podyaml文件…...

[Vue 配置] Vite + Vue3 项目配置和使用 NProgress

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/mfmsrf9tz98ox3qg 安装 pnpm i nprogress配置 NProgress 其他更多可参考&#xff0c;仓库地址&#xff1a;https://github.com/rstacruz/nprogress 在 src/config/nprogress.js 中进行配置 是否展示右上角圆…...

Android MQTT开发之 Hivemq MQTT Client

使用一个开源库&#xff1a;hivemq-mqtt-client&#xff0c;这是Java生态的一个MQTT客户端框架&#xff0c;需要Java 8&#xff0c;Android上使用的话问题不大&#xff0c;需要一些额外的配置&#xff0c;下面列出了相关的配置&#xff0c;尤其是 packagingOptions&#xff0c;…...

【Maven教程】(十一):使用 Maven 构建 Web应用 —— 使用 jetty-maven-plugin 进行测试、使用 Cargo 实现自动化部署~

Maven 使用 Maven 构建 Web应用 1️⃣ Web 项目的目录结构2️⃣ account-service2.1 account-service的 POM2.2 account-service 的主代码 3️⃣ account-web3.1 account-web 的POM3.2 account-web 的主代码 4️⃣ 使用 jetty-maven-plugin 进行测试5️⃣ 使用 Cargo 实现自动…...

番外 2 : LoadRunner 的安装以及配置

LoadRunner 的安装以及配置教程 一 . 配置 IE 浏览器二 . 安装 LoadRunner 工具三 . 修改默认浏览器的配置四 . 设置 LoadRunner 能够获取本地资源 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足以…...

win10正确配置tensorRT环境

目的 使用tensorRT进行网络模型部署&#xff0c;加快推理速度 方法 安装tensorRT的过程需要对各种组件的版本进行匹配 前置安装套件有&#xff1a; 1、CUDA 2、cuDNN 3、pyCUDA 4、tensorflow或pytorch 主要记录tensorRT安装: tensorRT安装配置查询 步骤: 1、去tensorRT官网…...

C++初阶-模板初阶

模板初阶 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板的原理2.4函数模板的原理2.5模板参数的匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& …...

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…...

dist.init_process_group() 卡住超时导致报错

在跑模型是遇到一个问题&#xff1a; import torch.distributed as dist dist.init_process_group(backend"nccl", init_methodtcp://localhost:%d % tcp_port, ranklocal_rank, world_sizenum_gpus)程序卡在这一步一动不动。. 解决办法一&#xff1a; 我看网上有人…...

RESTFul API:真是让人又爱又恨

RESTFul API是一种广泛使用的Web服务设计风格&#xff0c;它以资源为中心&#xff0c;通过HTTP方法来操作这些资源。然而&#xff0c;尽管RESTFul架构风格在许多情况下都非常有用&#xff0c;但在实际应用中&#xff0c;我们也发现了一些不足之处。本文将详细阐述这些问题&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

Python第七周作业

Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt&#xff0c;并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径&#xff0c;并创建logs目录&#xff08;若不存在&#xff09; 3.递归遍历目录data&#xff0c;输出所有.csv文件的路径…...