Avl 平衡二叉树 概念与代码实现

概念: 二叉树存在值顺序插入导致树高度过大的问题、平衡二叉树通过旋转的方式、使二叉树处于平衡状态、子树高度差不能大于1

旋转规则:

        左子树高右旋、右子树高左旋
        右旋时插入节点在最右、则子树先左旋
        左旋时插入节点在最左、则子树先右旋

代码实现: 

package com.info.dataStructure.avl;/*** @author haizhuangbu* @date 2024/3/22 10:47* @mark AvlNode 节点*/
public class AvlNode<T extends Comparable<T>> {AvlNode<T> left;AvlNode<T> right;T key;// 高度int height;public AvlNode(T key) {this.key = key;this.height = 0;}}
package com.info.dataStructure.avl;/*** @author haizhuangbu* @date 2024/3/22 10:45* @mark AvlTree*/
public class AvlTree<T extends Comparable<T>> {// 根节点private AvlNode<T> root;public AvlTree() {this.root = null;}/*** @param node 节点* @return 节点高度(树的高度)*/private int height(AvlNode<T> node) {if (node == null) return -1;return node.height;}private void updateHeight(AvlNode<T> node) {// 当前树的高度为 最大的子树高度 + 1node.height = Math.max(height(node.left), height(node.right)) + 1;}/*** @param avlNode 节点* @return 右旋*/private AvlNode<T> rotateLeft(AvlNode<T> avlNode) {AvlNode<T> right = avlNode.right;avlNode.right = right.left;right.left = avlNode;updateHeight(avlNode);updateHeight(right);return right;}/*** @param node 节点* @return 右旋*/private AvlNode<T> rotateRight(AvlNode<T> node) {AvlNode<T> left = node.left;node.left = left.right;left.right = node;updateHeight(node);updateHeight(left);return left;}private AvlNode<T> insert(AvlNode<T> node, T key) {if (node == null) return new AvlNode<>(key);// 将节点插入 平衡二叉树中if (key.compareTo(node.key) < 0) {node.left = insert(node.left, key);} else if (key.compareTo(node.key) > 0) {node.right = insert(node.right, key);} else {// 键值存在不需要插入return node;}// 不满足 子节点高度差不能大于1if (height(node.left) - height(node.right) == 2) {if (key.compareTo(node.left.key) < 0) {return rotateRight(node);} else {node.left = rotateLeft(node.left);return rotateRight(node);}} else if (height(node.right) - height(node.left) == 2) {if (key.compareTo(node.right.key) > 0) {return rotateLeft(node);} else {node.right = rotateRight(node.right);return rotateLeft(node);}}updateHeight(node);return node;}public void insert(T key) {root = insert(root, key);}}

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

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

相关文章

第28章 ansible的使用

第28章 ansible的使用 本章主要介绍在 RHEL8 中如何安装 ansible 及 ansible的基本使用。 ◆ ansible 是如何工作的 ◆ 在RHEL8 中安装ansible ◆ 编写 ansible.cfg 和清单文件 ◆ ansible 的基本用法 文章目录 第28章 ansible的使用28.1 安装ansible28.2 编写ansible.cfg和清…

Arrays.binarySearch 详解

Arrays.binarySearch 详解 Arrays类的binarySearch()方法&#xff0c;可以使用二分搜索法来搜索指定的数组&#xff0c;以获得指定对象。该方法返回要搜索元素的索引值。务必注意&#xff1a;数组必须经过排序才可以使用此方法&#xff0c;否则返回下标显示不准。binarySearch…

HDFS集群环境配置

环境如下三台服务器&#xff1a; 192.168.32.101 node1192.168.32.102 node2192.168.32.103 node3 一、Hadoop安装包下载&#xff0c;点此官网下载 二、Hadoop HDFS的角色包含&#xff1a; NameNode&#xff0c;主节点管理者DataNode&#xff0c;从节点工作者SecondaryNameN…

掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)

Go语言中的结构体&#xff08;Struct&#xff09;除了基本的定义和使用外&#xff0c;还有一些高级用法&#xff0c;可以让我们更灵活地使用结构体。下面详细解释一些高级用法&#xff1a; 结构体嵌套 结构体可以嵌套在其他结构体中&#xff0c;形成更复杂的数据结构。这种嵌…

Linux 中使用ISO文件 作为yum源

Linux 中使用ISO文件 作为yum源 在Linux中&#xff0c;可以将ISO文件挂载为本地YUM源。以下是如何操作的步骤和示例代码&#xff1a; 挂载ISO文件到某个目录&#xff08;例如/mnt/iso&#xff09;&#xff1a; mkdir /mnt/cdrom mount -o loop /path/to/your.iso /mnt/cdrom…

【科普向】什么是数据湖架构

数据湖架构是一种用于存储和管理大规模数据的设计模式。它的核心思想是将各种类型和格式的数据以原始形式存储在一个集中的存储系统中&#xff0c;而不需要预先定义数据结构或模式。以下是我对数据湖架构的理解和相关经验&#xff1a; 1. 构建数据湖&#xff1a;构建数据湖需要…

React Native: could not connect to development server

问题&#xff1a; 运行模拟器错误&#xff1a;无法连接到开发服务器 原因分析&#xff1a; 1、确认模拟器连接状态&#xff0c;是连接成功的 查看进程的端口占用&#xff0c;也没问题 lsof -i tcp:8081 kill pid2、检查包服务器是否运行正常 连接真机进行调试发现真机是正常…

基于springboot+vue+Mysql的“智慧食堂”设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Python 如何优雅编写多进程读取文件代码

文章目录 1. 背景2. multiprocessing库介绍2.1 创建进程2.2 进程池2.3 进程间通信2.4 进程同步 3. 多进程读取文件代码 1. 背景 在读取文件时&#xff0c;希望能够利用 Python 的多进程并行读取多个文件。有时&#xff0c;我们是基于类去编写代码的&#xff0c;那么对于类的方…

Basic RNN

文章目录 回顾RNNRNN CellRNNCell的使用RNN的使用 RNN例子使用RNN Cell实现使用RNN实现 嵌入层 Embedding独热向量的缺点Embedding LSTMGRU(门控循环单元)练习 回顾 DNN&#xff08;全连接&#xff09;&#xff1a;和CNN相比&#xff0c;拥有巨大的参数量&#xff0c;CNN权重共…

游泳耳机哪个牌子好?强烈推荐这4大高性能款式!

在如今的科技时代&#xff0c;游泳耳机已经成为了许多游泳爱好者和运动员的必备装备。一款好的游泳耳机不仅可以让你在水中享受到美妙的音乐&#xff0c;还可以为你提供更好的训练体验。 &#xff08;下图是我测试过的一部分游泳耳机&#xff1a;&#xff09; 但在市场上众多的…

基于FPGA实现的UDP协议栈设计_汇总

基于FPGA实现的千兆以太网UDP协议栈设计&#xff08;汇总篇&#xff09; 1. MAC设计 2. IP层设计 3. ARP层设计 4. UDP层设计 5. ICMP层设计 6. 仲裁器设计 8. RGMII接口设计 9. 跨时钟域设计

公募基金公开市场数据基础分析实例

公募基金公开市场数据基础分析 公募基金公开市场数据基础分析示例代码1.1 公开市场数据表结构 字段 字段类型 含义 SecurityID SYMBOL 基金代码 FullName STRING 基金全称 Name STRING 基金简称 Management SYMBOL 基金公司 Type SYMBOL 基金类型 Custodian SYMBOL 托管人 Issu…

AI大模型在医疗领域的应用案例:自然语言处理与医疗文本分析

随着人工智能技术的快速发展&#xff0c;AI大模型在自然语言处理、图像识别、语音识别等领域的应用越来越广泛。在医疗领域&#xff0c;AI大模型的应用正在深刻改变着医疗实践&#xff0c;为患者和医生带来前所未有的便利。近期AI医疗的概念也比较火热&#xff0c;本文将聚焦于…

编程题:相同数字的积木游戏(Java)

题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小薇找到这排积木中数字相同目所处位置最远的2块积木块&#xff0c;计算他们的…

css的border详解

CSS的border属性是一个简写属性&#xff0c;用于设置以下四个边框属性&#xff1a; border-width&#xff1a;定义边框的宽度。可以使用具体的像素值&#xff0c;或者使用预定义的关键字如thin、medium和thick。border-width不支持百分比值。默认情况下&#xff0c;边框的宽度是…

在线文本列表差集计算器

具体请前往&#xff1a;在线文本差集计算工具

system Verilog:clocking中定义信号为input和output的区别

在SystemVerilog中&#xff0c;clocking块用于定义时钟块&#xff0c;这通常用于描述时钟边缘和同步的输入/输出行为&#xff0c;特别是在测试平台和硬件接口描述中。 在下述两个代码示例中&#xff0c;主要区别在于a被定义为一个input还是output。 当a被定义为input时&#x…

云计算 3月22号 (mysql的主从复制)

一、MySQL-Replication&#xff08;主从复制&#xff09; 1.1、MySQL Replication 主从复制&#xff08;也称 AB 复制&#xff09;允许将来自一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;…

优化选址问题 | 基于禁忌搜索算法求解基站选址问题含Matlab源码

目录 问题代码问题 禁忌搜索算法(Tabu Search)是一种局部搜索算法的扩展,它通过引入一个禁忌列表来避免陷入局部最优解,并允许在一定程度上接受较差的解来跳出局部最优。在基站选址问题中,我们可以使用禁忌搜索算法来寻找满足覆盖要求且基站数量最少的选址方案。 以下是…