Python高级数据结构——AVL树

Python中的AVL树:高级数据结构解析

AVL树是一种自平衡二叉搜索树,它能够在每次插入或删除节点时通过旋转操作来保持树的平衡。在本文中,我们将深入讲解Python中的AVL树,包括AVL树的基本概念、平衡性维护、插入、删除和查询操作,并使用代码示例演示AVL树的使用。

基本概念

1. AVL树的平衡性

AVL树保持平衡的关键在于每个节点的平衡因子(Balance Factor),即左子树的高度减去右子树的高度。平衡因子的绝对值不能超过1,否则树就不再平衡,需要通过旋转操作进行调整。

class AVLNode:def __init__(self, key, left=None, right=None):self.key = keyself.left = leftself.right = rightself.height = 1  # 节点高度class AVLTree:def __init__(self):self.root = None# 获取节点高度def _height(self, node):return node.height if node else 0# 更新节点高度def _update_height(self, node):node.height = max(self._height(node.left), self._height(node.right)) + 1# 获取平衡因子def _balance_factor(self, node):return self._height(node.left) - self._height(node.right)

平衡性维护

2. AVL树的旋转操作

AVL树通过四种旋转操作来保持平衡:左旋、右旋、左右旋和右左旋。

   # 左旋def _left_rotate(self, y):x = y.rightT2 = x.leftx.left = yy.right = T2self._update_height(y)self._update_height(x)return x# 右旋def _right_rotate(self, x):y = x.leftT2 = y.righty.right = xx.left = T2self._update_height(x)self._update_height(y)return y# 左右旋def _left_right_rotate(self, z):z.left = self._left_rotate(z.left)return self._right_rotate(z)# 右左旋def _right_left_rotate(self, z):z.right = self._right_rotate(z.right)return self._left_rotate(z)

插入操作

3. AVL树的插入

在AVL树中插入新节点后,需要检查每个祖先节点的平衡因子,并进行必要的旋转操作以保持平衡。

   # 插入节点def insert(self, root, key):if not root:return AVLNode(key)if key < root.key:root.left = self.insert(root.left, key)else:root.right = self.insert(root.right, key)# 更新节点高度self._update_height(root)# 获取平衡因子balance = self._balance_factor(root)# 平衡性维护if balance > 1:if key < root.left.key:return self._right_rotate(root)else:return self._left_right_rotate(root)if balance < -1:if key > root.right.key:return self._left_rotate(root)else:return self._right_left_rotate(root)return rootdef insert_key(self, key):self.root = self.insert(self.root, key)

删除操作

4. AVL树的删除

在AVL树中删除节点后,同样需要检查每个祖先节点的平衡因子,并进行必要的旋转操作以保持平衡。

  # 删除节点def delete(self, root, key):if not root:return rootif key < root.key:root.left = self.delete(root.left, key)elif key > root.key:root.right = self.delete(root.right, key)else:# 节点包含一个或零个子节点if not root.left:return root.rightelif not root.right:return root.left# 节点包含两个子节点,找到右子树的最小节点temp = self._min_value_node(root.right)root.key = temp.keyroot.right = self.delete(root.right, temp.key)# 更新节点高度self._update_height(root)# 获取平衡因子balance = self._balance_factor(root)# 平衡性维护if balance > 1:if self._balance_factor(root.left) >= 0:return self._right_rotate(root)else:return self._left_right_rotate(root)if balance < -1:if self._balance_factor(root.right) <= 0:return self._left_rotate(root)else:return self._right_left_rotate(root)return rootdef delete_key(self, key):self.root = self.delete(self.root, key)

查询操作

5. AVL树的查询

AVL树的查询操作与普通的二叉搜索树相同,通过递归实现。

   # 查询节点def search(self, root, key):if not root or root.key == key:return rootif root.key < key:return self.search(root.right, key)return self.search(root.left, key)def search_key(self, key):return self.search(self.root, key)

应用场景

AVL树适用于需要频繁进行插入和删除操作,并且希望维持树的平衡性的场景。典型的应用场景包括数据库索引、编译器中的符号表等。

总结

AVL树是一种自平衡二叉搜索树,通过旋转操作保持树的平衡。在Python中,我们可以使用类似上述示例的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java序列化的实现

标题&#xff1a;深入理解Java序列化及其应用 摘要&#xff1a;Java序列化是一种机制&#xff0c;用于将对象转换为字节流以便存储或传输&#xff0c;并在需要时重新创建对象。本文将介绍Java序列化的基本概念、使用方法以及一些实际应用场景&#xff0c;并给出一些示例代码。…

[LLM]nanoGPT---训练一个写唐诗的GPT

karpathy/nanoGPT: The simplest, fastest repository for training/finetuning medium-sized GPTs. (github.com) 原有模型使用的莎士比亚的戏剧数据集, 如果需要一个写唐诗机器人&#xff0c;需要使用唐诗的文本数据&#xff0c; 一个不错的唐诗&#xff0c;宋词数据的下载…

C#多线程总结

目录 前言 一、异步线程 使用async和await关键字 基于委托实现 二、同步线程 三、Thread线程 开启线程 设置线程优先级 Thread拓展封装 四、ThreadPool线程池 常规使用 设置线程数 线程等待 Thread和ThreadPool比较 通过线程池做一些扩展&#xff08;定时器类&am…

Git篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如果分支是否已合并为master,你可以通过什么手段知道?二、 什么是SubGit?三、列举工作中常用的几个git命令?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文…

视频监控管理平台/智能监测/检测系统EasyCVR中HLS流无法播放的解决方案

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【EI会议征稿】第三届电力系统与电力工程国际学术会议(PSPE 2024)

第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09; 2024 3rd International Conference on Power System and Power Engineering(PSPE 2024) 第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09;于2024年3月29-31日在中国三亚隆重召…

Python 反编译Il2Cpp APK

引入 https://github.com/Perfare/Il2CppDumper/ 实现 开源的Ii2Cpp Dumper可以帮助我们将So和globalmetadata.dat文件反编译出 Assembly-CSharp.dll 本博客教程可以帮助我们直接拖入APK反编译出来 调用方式 两种 第一种 拖入后回车运行 第二种 放入运行的根目录下 源码 i…

docker核心原理——unionfs、namespace、cgroup

docker 核心原理 docker的核心原理其实就是cgroupnamespaceunionfs 组合实现的隔离机制&#xff0c;资源控制等。 隔离机制 在容器进程启动之前重新挂载它的整个根⽬录“/”&#xff0c;⽤来为容器提供隔离后的执⾏环境⽂件系统通过Linux Namespace 创建隔离&#xff0c;决…

ONNX简介

1、简介 Open Neural Network Exchange&#xff08;ONNX&#xff0c;开放神经网络交换&#xff09;格式&#xff0c;是一个用于表示深度学习模型的标准&#xff0c;可使模型在不同框架之间进行转移。 ONNX是一种针对机器学习所设计的开放式的文件格式&#xff0c;用于存储训练…

解决 php 连接mysql数据库时报错:Fatal error: Class ‘mysqli’ not found in问题【更新23.12.12】

在使用php对mysql进行连接的过程中&#xff0c;出现了Fatal error: Uncaught Error: Class "mysqli" not found in的问题 解决方案 这个错误通常表示您的PHP代码中缺少MySQL扩展或者没有启用MySQL扩展。 我们首先确认一下PHP环境中已经安装了MySQL扩展。检查一下自己…

TDengine 签约大唐水电院,助力水电时序数据高效写入存储查询

近日&#xff0c;TDengine 成功签约大唐水电科学技术研究院&#xff0c;为其提供高效、可靠的数据处理解决方案。据了解&#xff0c;大唐水电科学技术研究院是中国大唐集团有限公司下属企业&#xff0c;是中国大唐集团科学技术研究总院有限公司的全资子公司。自成立以来&#x…

谷歌评论更新完成--须知

谷歌完成了他们上次宣布的评论系统更新的推出。评论系统的未来更新将不再公布&#xff0c;因为为评论系统提供支持的算法将定期和持续更新。 评论系统 谷歌的评论系统是一个系统&#xff0c;用作一组算法的一部分&#xff0c;这些算法共同产生搜索结果。 评论系统在对评论相…

骨传导耳机十大品牌排行榜,骨传导耳机品牌排名哪个好

骨传导蓝牙耳机的使用越来越广泛&#xff0c;无论是在户外运动还是在办公室工作&#xff0c;它都能为你带来自由的音乐体验。在本文中&#xff0c;我们将为你介绍十款TOP级骨传导蓝牙耳机&#xff0c;这些品牌在市场上拥有良好的口碑和广泛的使用者。通过本下面的选购指南&…

Filter的url-pattern、Filter的生命周期以及FilterConfig和一个拦截访问的小案例

1.url-pattern&#xff1a;Filter的拦截路径&#xff0c;即浏览器在请求什么位置的资源时&#xff0c;过滤器会进行拦截 2.精准匹配<url-pattern>/a.jsp</url-pattern>对应的请求地址&#xff1a;http://ip[域名]:port/工程路径/a.jsp会拦截 3.目录匹配<url-p…

CanEasy多场景应用,让汽车总线测试更简单

来源&#xff1a;虹科汽车电子 虹科分享 | CanEasy多场景应用&#xff0c;让汽车总线测试更简单 原文链接&#xff1a;https://mp.weixin.qq.com/s/ojic4xfVTLbxXcKlJMGQZw 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 CanEasy是一个基于Windows的总线工具&…

SpringBoot项目静态资源默认访问目录

SpringBoot项目&#xff1a;静态资源默认访问目录 参考博客&#xff1a;https://blog.csdn.net/weixin_43808717/article/details/118281904

基于itextpdf的java读取和更新pdf表单域字段值功能

基于itextpdf的java读取和更新pdf表单域字段值功能 执行结果为&#xff1a; Hello World! keytopmostSubform[0].Page1[0].qhjc[0] keytopmostSubform[0].Page1[0].qhmc[0] keytopmostSubform[0].Page1[0].cqzh[0] keytopmostSubform[0].Page1[0].fm_year[0] keytopmostSubf…

wx.chooseLocation 用户选择地理位置的api使用方式,(uniapp)

框架&#xff1a;uniapp &#xff0c;开发微信小程序&#xff0c; 遇到的场景&#xff1a;需要用户选择地理位置 首先贴api官方文档 开发前注意事项&#xff1a;网址 调用这个api前需要在manifest.json里面配置声明该接口&#xff08;必须&#xff09; "permission&q…

力扣每日一题day30[226. 翻转二叉树]

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#…

vue小结之 watch监听(对象,单个字段属性)

好记性不如个烂笔头&#xff1a;方便每次使用忘记的时候&#xff0c;看看点滴的累积&#xff0c;点滴的成长&#xff01; watch监听使用&#xff1a; 1.监听对象&#xff1a; <input type"checkbox" id"toggle-button" name"switch" v-mode…