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

Java手写AVL树

Java手写AVL树

1. AVL树实现思路原理

为了解释AVL树的实现思路原理,下面使用Mermanid代码表示该算法的思维导图:

AVL树
平衡因子
左子树
右子树
左子树高度
右子树高度
平衡因子计算
BF = 左子树高度 - 右子树高度
左子树的左子树高度
左子树的右子树高度
右子树的左子树高度
右子树的右子树高度
平衡调整
左旋转
右旋转
左子树变为根节点
原根节点变为右子节点
右子树变根节点
原根节点变左子节点

2. AVL树的手写必要性

手写AVL树的必要性主要体现在以下几个方面:

  1. 深入理解AVL树的原理和实现过程,加深对数据结构和算法的理解。
  2. 学习如何进行平衡二叉树的插入、删除和查找操作。
  3. 实际应用中可能需要自定义平衡二叉树的数据结构,手写AVL树可以满足特定需求。

3. AVL树的市场调查

市场调查显示,AVL树在各种领域都有广泛的应用。特别是在需要高效插入、删除和查找操作的场景下,AVL树具有较好的性能表现。常见的应用领域包括数据库索引、网络路由算法、编译器优化等。

4. AVL树的实现详细介绍和步骤

步骤1:定义AVL树的节点结构

首先,我们需要定义AVL树的节点结构,包括节点值、左子节点、右子节点、平衡因子等属性。

class AVLNode {int value;AVLNode left;AVLNode right;int balanceFactor;public AVLNode(int value) {this.value = value;this.left = null;this.right = null;this.balanceFactor = 0;}
}

步骤2:实现AVL树的插入操作

AVL树的插入操作是对二叉搜索树的插入操作进行了平衡调整。具体步骤如下:

  1. 在二叉搜索树中插入新节点。
  2. 更新插入路径上各节点的平衡因子。
  3. 如果某个节点的平衡因子绝对值大于1,则进行相应的平衡调整。
class AVLTree {private AVLNode root;// 插入节点public void insert(int value) {root = insertNode(root, value);}// 插入节点辅助函数private AVLNode insertNode(AVLNode node, int value) {if (node == null) {return new AVLNode(value);}if (value < node.value) {node.left = insertNode(node.left, value);} else if (value > node.value) {node.right = insertNode(node.right, value);} else {return node; // 值已存在,不插入}// 更新平衡因子node.balanceFactor = Math.max(getHeight(node.left), getHeight(node.right)) + 1;// 平衡调整int balance = getBalanceFactor(node);if (balance > 1 && value < node.left.value) {return rightRotate(node);}if (balance < -1 && value > node.right.value) {return leftRotate(node);}if (balance > 1 && value > node.left.value) {node.left = leftRotate(node.left);return rightRotate(node);}if (balance < -1 && value < node.right.value) {node.right = rightRotate(node.right);return leftRotate(node);}return node;}// 获取节点高度private int getHeight(AVLNode node) {if (node == null) {return 0;}return Math.max(getHeight(node.left), getHeight(node.right)) + 1;}// 获取节点的平衡因子private int getBalanceFactor(AVLNode node) {if (node == null) {return 0;}return getHeight(node.left) - getHeight(node.right);}// 左旋转private AVLNode leftRotate(AVLNode node) {AVLNode rightChild = node.right;AVLNode leftGrandChild = rightChild.left;rightChild.left = node;node.right = leftGrandChild;node.balanceFactor = Math.max(getHeight(node.left), getHeight(node.right)) + 1;rightChild.balanceFactor = Math.max(getHeight(rightChild.left), getHeight(rightChild.right)) + 1;return rightChild;}// 右旋转private AVLNode rightRotate(AVLNode node) {AVLNode leftChild = node.left;AVLNode rightGrandChild = leftChild.right;leftChild.right = node;node.left = rightGrandChild;node.balanceFactor = Math.max(getHeight(node.left), getHeight(node.right)) + 1;leftChild.balanceFactor = Math.max(getHeight(leftChild.left), getHeight(leftChild.right)) + 1;return leftChild;}
}

步骤3:实现AVL树的删除操作

AVL树的删除操作也是对二叉搜索树的删除操作进行了平衡调整。具体步骤如下:

  1. 在二叉搜索树中删除目标节点。
  2. 更新删除路径上各节点的平衡因子。
  3. 如果某个节点的平衡因子绝对值大于1,则进行相应的平衡调整。
class AVLTree {// ...// 删除节点public void delete(int value) {root = deleteNode(root, value);}// 删除节点辅助函数private AVLNode deleteNode(AVLNode node, int value) {if (node == null) {return null;}if (value < node.value) {node.left = deleteNode(node.left, value);} else if (value > node.value) {node.right = deleteNode(node.right, value);} else {if (node.left == null || node.right == null) {node = (node.left != null) ? node.left :node.right;} else {AVLNode minNode = findMin(node.right);node.value = minNode.value;node.right = deleteNode(node.right, minNode.value);}}if (node == null) {return null;}// 更新平衡因子node.balanceFactor = Math.max(getHeight(node.left), getHeight(node.right)) + 1;// 平衡调整int balance = getBalanceFactor(node);if (balance > 1 && getBalanceFactor(node.left) >= 0) {return rightRotate(node);}if (balance > 1 && getBalanceFactor(node.left) < 0) {node.left = leftRotate(node.left);return rightRotate(node);}if (balance < -1 && getBalanceFactor(node.right) <= 0) {return leftRotate(node);}if (balance < -1 && getBalanceFactor(node.right) > 0) {node.right = rightRotate(node.right);return leftRotate(node);}return node;}// 查找最小节点private AVLNode findMin(AVLNode node) {while (node.left != null) {node = node.left;}return node;}
}

步骤4:实现AVL树的查找操作

AVL树的查找操作与二叉搜索树的查找操作相同,不需要进行平衡调整。

class AVLTree {// ...// 查找节点public boolean search(int value) {return searchNode(root, value);}// 查找节点辅助函数private boolean searchNode(AVLNode node, int value) {if (node == null) {return false;}if (value < node.value) {return searchNode(node.left, value);} else if (value > node.value) {return searchNode(node.right, value);} else {return true;}}
}

步骤5:测试AVL树的各个操作

public class Main {public static void main(String[] args) {AVLTree tree = new AVLTree();tree.insert(10);tree.insert(20);tree.insert(30);tree.insert(40);tree.insert(50);tree.insert(25);System.out.println("AVL树是否包含值30:" + tree.search(30)); // 输出:truetree.delete(30);System.out.println("AVL树是否包含值30:" + tree.search(30)); // 输出:false}
}

相关文章:

Java手写AVL树

Java手写AVL树 1. AVL树实现思路原理 为了解释AVL树的实现思路原理&#xff0c;下面使用Mermanid代码表示该算法的思维导图&#xff1a; #mermaid-svg-ycH8kKpzVk2HWEby {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid…...

运维自动化:提高效率的秘诀

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

C++设计模式_05_Observer 观察者模式

接上篇&#xff0c;本篇将会介绍C设计模式中的Observer 观察者模式&#xff0c;和前2篇模板方法Template Method及Strategy 策略模式一样&#xff0c;仍属于“组件协作”模式。Observer 在某些领域也叫做 Event 。 文章目录 1. 动机&#xff08; Motivation&#xff09;2. 代码…...

github网站打不开,hosts文件配置

首先获取github官网的ip地址&#xff0c; 打开cmd&#xff0c;输入ping github.com 配置&#xff1a; #github 140.82.114.4 github.com 199.232.69.194 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.110.153 assets-cdn.github.com 185.199…...

总结PCB设计的经验

一般PCB基本设计流程如下&#xff1a;前期准备->PCB结构设计->PCB布局->布线->布线优化和丝印->网络和DRC检查和结构检查->制版。: :   第一&#xff1a;前期准备。这包括准备元件库和原理图。“工欲善其事&#xff0c;必先利其器”&#xff0c;要做出一…...

HCIE-HCS规划设计搭建

1、相关术语 1、等价路由 等价路由&#xff08;Equal-cost routing&#xff09;是一种网络路由策略&#xff0c;用于在网络中选择多个具有相同路由度量&#xff08;路由距离或成本&#xff09;的最佳路径之一来转发数据流量。 当存在多个路径具有相同的路由度量时&#xff0c;…...

c语言输出杨辉三角

#include<stdio.h> int main() {int x 0; //表示杨辉三角的的大小int y 1;printf("请输入x的值: ");scanf("%d", &x);for (int i 0; i < x; i) {for (int j 0; j < i; j) {if (j 0 || i 0) {y 1;}else {y y * (i - j 1) / j;}pri…...

性能测试-持续测试及性能测试建设(22)

什么是持续测试? 持续测试定义为:在软件交付流水线中执行自动化测试的过程,目的是获得关于预发布软件业务风险的即时反馈。 完成持续测试,我们还是需要回到定义中,它有3个关键词:软件交付流水线、自动化测试、即时反馈。 首先,持续测试需要具备一条完整的流水线,其代表…...

嵌入式C 语言中的三块技术难点

​ C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认…...

【斗破年番】紫研新形象,萧炎终成翻海印,救援月媚,三宗决战

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗破年番。 斗破苍穹年番动画更新了&#xff0c;小医仙帅气回归&#xff0c;萧炎紫妍成功进入山谷闭关苦修&#xff0c;美杜莎女王守护没多久&#xff0c;就因蛇人族求救离开。从官方公布的最新预告来看&#xff0c;萧炎紫…...

差分方程模型:国民总收入(GDP)的乘数-加速数模型

【背景知识-凯恩斯经济增长模型】 凯恩斯(John M.Keynes)建立了著名的国民经济增长模型。令Y表示国民总收入&#xff0c;C表示总消费&#xff0c;E为总支出&#xff0c;I表示投资&#xff0c;G为政府的投入&#xff08;如基建等&#xff09;。那么有 【6.1】 其中&#xff0…...

【C语言】指针和数组笔试题解析(1)

指针是C语言的灵魂&#xff0c;他的玩法多种多样&#xff0c;这篇文章带来指针的笔试题详解&#xff0c;可以帮助我们更好的理解与巩固指针的知识 目录 预备知识&#xff1a;题目&#xff1a;一维数组&#xff1a;二维数组&#xff1a; 题目比较多&#xff0c;但切记戒骄戒躁&a…...

Vue中组件的三种注册方式

组件的注册 1.全局注册&#xff1a; 在全局注册中&#xff0c;你需要确保在 Vue 根实例之前导入并注册组件。通常&#xff0c;你会在入口文件&#xff08;例如 main.js&#xff09;中执行这些操作。 // main.jsimport Vue from vue; import App from ./App.vue;// 导入全局组…...

docker 和k8s 入门

docker 和k8s 入门 本文是云原生的学习记录&#xff0c;可以参考以下文档 k8s https://www.yuque.com/leifengyang/oncloud 相关视频教程可参考如下 https://www.bilibili.com/video/BV13Q4y1C7hS?p2&vd_source0882f549dac54045384d4a921596e234 相对于公有云&#x…...

基于Yolov8的交通标志牌(TT100K)识别检测系统

1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前YOLO成功基础上&#xff0c;并引入了新功能和改进&#xff0c;以进一步提升性能和灵活…...

使用Python编写一个多线程的12306抢票程序

国庆长假即将到来&#xff0c;大家纷纷计划着自己的旅行行程。然而&#xff0c;对于很多人来说&#xff0c;抢购火车票人们成了一个令人头疼的问题。12306网站的服务器经常因为流量高而崩溃&#xff0c;导致抢票变得越来越严重异常困难。 首先&#xff0c;让我们来了解一下1230…...

DT Paint Effects工具(三)

管 分支 使用细枝 叶 力 使用湍流 流动画 渲染全局参数 建造盆栽植物...

SpringBoot整合Mybatis

目录 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写Mapper接口 &#xff08;3&#xff09;编写Mapper映射文件 &#xff08;4&#xff09;编写yml配置文件 &#xff08;5&#xff09;编写测试类 &#xff08;1&#xff09;引入依赖 <dependency>…...

Java后端使用POST请求向mysql中插入Json数据的问题

1.后端请求正常 但数据表中value没有值 原因 json数据属性不符合spring解析格式&#xff0c;json属性名称的大写字母不符合spring要求 以下为为错误示范 1 Test 以大写字母开头&#xff0c; 2 tTest 小写字母开头&#xff0c;但是第二个字母是大写解决方案 实体类属性加上Jso…...

豆瓣图书评分数据的可视化分析

导语 豆瓣是一个提供图书、电影、音乐等文化产品的社区平台&#xff0c;用户可以在上面发表自己的评价和评论&#xff0c;形成一个丰富的文化数据库。本文将介绍如何使用爬虫技术获取豆瓣图书的评分数据&#xff0c;并进行可视化分析&#xff0c;探索不同类型、不同年代、不同…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...