当前位置: 首页 > 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}
}
http://www.lryc.cn/news/168619.html

相关文章:

  • 运维自动化:提高效率的秘诀
  • C++设计模式_05_Observer 观察者模式
  • github网站打不开,hosts文件配置
  • 总结PCB设计的经验
  • HCIE-HCS规划设计搭建
  • c语言输出杨辉三角
  • 性能测试-持续测试及性能测试建设(22)
  • 嵌入式C 语言中的三块技术难点
  • 【斗破年番】紫研新形象,萧炎终成翻海印,救援月媚,三宗决战
  • 差分方程模型:国民总收入(GDP)的乘数-加速数模型
  • 【C语言】指针和数组笔试题解析(1)
  • Vue中组件的三种注册方式
  • docker 和k8s 入门
  • 基于Yolov8的交通标志牌(TT100K)识别检测系统
  • 使用Python编写一个多线程的12306抢票程序
  • DT Paint Effects工具(三)
  • SpringBoot整合Mybatis
  • Java后端使用POST请求向mysql中插入Json数据的问题
  • 豆瓣图书评分数据的可视化分析
  • SpringBoot整合Easy-ES操作演示文档
  • IDEA控制台取消悬浮全局配置SpringBoot配置https
  • MySQL8--my.cnf配置文件的设置
  • Qt基于paintEvent自定义CharView
  • Mac FoneLab for Mac:轻松恢复iOS数据,专业工具助力生活
  • 代码随想录二刷day30
  • 工业检测 ocr
  • LVS负载均衡群集
  • 安卓截屏;前台服务
  • C++ PrimerPlus 复习 第八章 函数探幽
  • JavaScript-Ajax-axios-Xhr