恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

AVL树的实现(Java版)

  • 首页
  • 资讯中心
  • /
  • AVL树的实现(Java版)

相关资讯

InstructGLM 微调教程:基于Alpaca 52k英文指令数据的LoRA微调全流程 2026/8/17 18:42:20
别再手动来回切图了:用 rgthree-comfy 轻松搞定 ComfyUI 图像对比与精准裁剪 2026/8/17 18:42:20
安全编程实践:避免Unicode拼接与头文件冲突的隐患 2026/8/17 18:42:20

最新资讯

单片机计算机毕设之基于 STM32 的多按键人机交互智能雨刮系统设计 基于 STM32 的分级雨量响应雨刮调速控制系统设计(013403)
【单片机课程设计/毕业设计】基于 STM32 的 OLED 显示环境感知车载智能装置设计 基于 STM32 的多按键人机交互智能雨刮系统设计(013403)
Linux 中 iptables、SELinux、firewalld 的区别与使用方法
计算机单片机毕设实战-基于 STM32 传感器数据采集与车载执行机构控制系统设计 基于 STM32 的雨量光照监测与自动雨刮照明装置设计(013403)
【单片机毕业设计】基于 STM32 的自动 / 手动双模式车载感知控制系统设计 基于 STM32 的阈值可调式智能雨刮灯光控制系统设计(013403)
如何用MediaCrawler一次搞定小红书抖音等平台的数据采集

今日推荐

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题
LabVIEW异步调用实战:解决界面卡顿与并行处理难题
飞书局域网文件传输实战:3种方案实现高速点对点传输

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

AVL树的实现(Java版)

发布时间:2026/8/17 18:47:20
AVL树的实现(Java版) 当我们用普通二叉搜索树查询数据的时候最好情况是这是一棵平衡二叉树时间复杂度可以达到O(log₂n)最坏情况是数据全是升序或全是降序的情况时间复杂度会达到O(n)。为了避免这种情况我们引入了AVL树它在二叉搜索树的基础上通过旋转操作来保持平衡使得所有节点的左右子树高度差的绝对值不超过1。具体思路如图具体代码如下//自己创建AVL树 public class AVL { static class TreeNode{ public int val; public int bf; public TreeNode left; public TreeNode right; public TreeNode parent; public TreeNode(int val){ this.val val; } } public TreeNode root; public boolean insert(int val){ TreeNode treeNodenew TreeNode(val); //先正常插入 if(rootnull){ roottreeNode; return true; } //正常插入的时候定义了两个新变量应该是pparent一个是cur TreeNode pnull; TreeNode curroot; while(cur!null){ if (valcur.val){ pcur; curcur.right; } else if (valcur.val) { return false; } else { pcur; curcur.left; } } //走完这里之后p走到了我们要放的地方的父亲节点cur走到了空 if (valp.val){ p.righttreeNode; }else { p.lefttreeNode; } treeNode.parentp; curtreeNode; //插入完之后要判断是否平衡如果不平衡要进行旋转 while (p!null){ //先增加bf然后再判断最后再旋转 if(curp.left){ p.bf--; }else { p.bf; } //开始判断平衡因子是否需要旋转 if(p.bf0){ break; } else if (p.bf1||p.bf-1) { curp; pcur.parent; } else { //这里是p的bf等于2或者-2是需要调整的 if(p.bf-2){ if (cur.bf-1){ //我们需要右旋 RotateR(p); }else { //我们需要先左旋再右旋 RotateLR(p); } }else { //p.bf2 if (cur.bf1) { //我们需要左旋 RotateL(p); }else { //我们需要先右旋再左旋 RotateRL(p); } } break; } } return true; } private void RotateRL(TreeNode p) { TreeNode subRp.right; TreeNode subRLsubR.left; int bf subRL.bf; RotateR(p.right); RotateL(p); //重新调整bf if (bf-1){ subR.bf0; p.bf0; subRL.bf1; }else if (bf1){ subR.bf-1; p.bf0; subRL.bf0; } } private void RotateL(TreeNode p) { TreeNode subRp.right; TreeNode subRLsubR.left; subR.leftp; p.rightsubRL; //开始指向父亲节点 if (subRL!null){ subRL.parentp; } p.parentsubR; TreeNode Ppp.parent; if(proot) { root subR; subR.parent null; }else { if(Pp.leftp){ Pp.leftsubR; }else { Pp.rightsubR; } subR.parentPp; } //修改bf p.bf0; subR.bf0; } private void RotateLR(TreeNode p) { TreeNode subLp.left; TreeNode subLRsubL.right; int bf subLR.bf; //我们传入的这个参数都是要转的那一部分的头节点 RotateL(subL); RotateR(p); //重新调整bf if (bf-1){ subLR.bf0; subL.bf0; p.bf1; }else if (bf1){ subLR.bf0; subL.bf-1; p.bf0; } } //右旋 private void RotateR(TreeNode p) { TreeNode subLp.left; TreeNode subLRsubL.right; //subLR可能是空的 //开始旋转 //先指向子结点 subL.rightp; p.leftsubLR; //再指向父结点 if(subLR!null){ subLR.parentp; } TreeNode Ppp.parent; p.parentsubL; //可能原来的p节点并不是根结点 if(proot){ rootsubL; subL.parentnull; }else { if (Pp.leftp){ Pp.leftsubL; }else { Pp.rightsubL; } subL.parentPp; } //调节平衡因子,根据我给的例子来看可以对比一下旋转完的两张图变了p.bg和subL.bf p.bf0; subL.bf0; } private int height(TreeNode root) { if(root null) return 0; int leftH height(root.left); int rightH height(root.right); return leftH rightH ? leftH1 : rightH1; } public boolean isBalanced(TreeNode root) { if(root null) return true; int leftH height(root.left); int rightH height(root.right); if(rightH-leftH ! root.bf) { System.out.println(这个节点root.val 平衡因子异常); return false; } return Math.abs(leftH-rightH) 1 isBalanced(root.left) isBalanced(root.right); } }public class test { public static void main(String[] args) { int[] array {4, 2, 6, 1, 3, 5, 15, 7, 16}; //int[] array {30,20,90,60,180,40}; AVL avlTree new AVL(); for (int i 0; i array.length; i) { avlTree.insert(array[i]); } System.out.println(avlTree.isBalanced(avlTree.root)); } }

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号