package com.tomsnail.data.tree;
/*** AVL二叉平衡树* @author tomsnail* @date 2015年3月30日 下午4:35:50*/
public class AVLTree {/*** 根节点* @author tomsnail* @date 2015年3月30日 下午4:36:54*/private AVLNode rootNode;private String bulidType = "";/*** 增加一个节点* @author tomsnail* @date 2015年3月30日 下午4:36:08*/public void add(int value){AVLNode subNode = null;if(rootNode==null){subNode  = new AVLNode(value);rootNode = subNode;}else{            subNode = addNode(rootNode,value);}reBuild(subNode);}private AVLNode addNode(AVLNode node,int value){AVLNode subNode = null;if(node.getValue()>value){if(node.getLeftNode()==null){subNode = new AVLNode(value);node.setLeftNode(subNode);}else{subNode = addNode(node.getLeftNode(), value);}}if(node.getValue()<value){if(node.getRightNode()==null){subNode = new AVLNode(value);node.setRightNode(subNode);}else{subNode = addNode(node.getRightNode(),value);}}return subNode;}/*** 重平衡树* @author tomsnail* @date 2015年3月30日 下午5:42:00*/private void reBuild(AVLNode node){if(node!=null){AVLNode tempRootNode = findTempRootNode(node);if(tempRootNode!=null){if(bulidType.equals("ll")){Lrotate(node,tempRootNode);}else if(bulidType.equals("rr")){Rrotate(node,tempRootNode);}else if(bulidType.equals("lr")){Rrotate(node,tempRootNode.getLeftNode());Lrotate(node,tempRootNode);}else if(bulidType.equals("rl")){Lrotate(node,tempRootNode.getRightNode());Rrotate(node,tempRootNode);}}}}/*** 左旋* @author tomsnail* @date 2015年3月30日 下午9:23:28*/private void Rrotate(AVLNode node,AVLNode tempRootNode){AVLNode rotateNode = tempRootNode.getRightNode();AVLNode rootNode = tempRootNode.getRootNode();String type = "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){type="l";}else{type="r";}}AVLNode adjustNode = rotateNode.getLeftNode();rotateNode.setLeftNode(tempRootNode);tempRootNode.setRightNode(null);if(adjustNode!=null){tempRootNode.setRightNode(adjustNode);}if(rootNode==null){rotateNode.setRootNode(null);this.rootNode = rotateNode;}if(type.equals("r")){rootNode.setRightNode(rotateNode);}else if(type.equals("l")){rootNode.setLeftNode(rotateNode);}}/*** 右旋* @author tomsnail* @date 2015年3月30日 下午9:23:28*/private void Lrotate(AVLNode node,AVLNode tempRootNode){AVLNode rotateNode = tempRootNode.getLeftNode();AVLNode rootNode = tempRootNode.getRootNode();String type = "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){type="l";}else{type="r";}}AVLNode adjustNode = rotateNode.getRightNode();rotateNode.setRightNode(tempRootNode);tempRootNode.setLeftNode(null);if(adjustNode!=null){tempRootNode.setLeftNode(adjustNode);}if(rootNode==null){rotateNode.setRootNode(null);this.rootNode = rotateNode;}if(type.equals("r")){rootNode.setRightNode(rotateNode);}else if(type.equals("l")){rootNode.setLeftNode(rotateNode);}}/*** 查找最小不平衡的根节点* @author tomsnail* @date 2015年3月30日 下午5:40:55*/private AVLNode findTempRootNode(AVLNode node){AVLNode noB = getNoBalance(node);if(noB==null){return null;}if(isTypeLL(noB)){bulidType = "ll";}else if(isTypeRR(noB)){bulidType = "rr";}else if(isTypeLR(noB)){bulidType = "lr";}else if(isTypeRL(noB)){bulidType = "rl";}return noB;}private boolean isTypeLL(AVLNode noB){try {if(noB.getRightNode()==null&&noB.getLeftNode().getRightNode()==null&&!noB.getLeftNode().getLeftNode().hasSubNode()){return true;}if(noB.getRightNode()!=null&&noB.getLeftNode().getRightNode()!=null&&noB.getLeftNode().getLeftNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeRR(AVLNode noB){try {if(noB.getLeftNode()==null&&noB.getRightNode().getLeftNode()==null&&!noB.getRightNode().getRightNode().hasSubNode()){return true;}if(noB.getLeftNode()!=null&&noB.getRightNode().getLeftNode()!=null&&noB.getRightNode().getRightNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeLR(AVLNode noB){try {if(noB.getRightNode()==null&&noB.getLeftNode().getLeftNode()==null&&!noB.getLeftNode().getRightNode().hasSubNode()){return true;}if(noB.getRightNode()!=null&&noB.getLeftNode().getLeftNode()!=null&&noB.getLeftNode().getRightNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeRL(AVLNode noB){try {if(noB.getLeftNode()==null&&noB.getRightNode().getRightNode()==null&&!noB.getRightNode().getLeftNode().hasSubNode()){return true;}if(noB.getLeftNode()!=null&&noB.getRightNode().getRightNode()!=null&&noB.getRightNode().getLeftNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private AVLNode getNoBalance(AVLNode node){if(node.getRootNode()==null){return null;}else{if(!isBalance(node.getRootNode())){return node.getRootNode();}else{return getNoBalance(node.getRootNode());}}}/*** 查找一个节点* @author tomsnail* @date 2015年3月30日 下午4:36:35*/public AVLNode find(int value){return findWith2(rootNode,value);}private AVLNode findWith2(AVLNode node,int value){if(node==null){return null;}System.out.println(node.getValue());if(node.getValue()>value){return findWith2(node.getLeftNode(),value);}else if(node.getValue()<value){return findWith2(node.getRightNode(),value);}else{return node;}}public void midScan(AVLNode node){if(node==null){return;}midScan(node.getLeftNode());System.out.println(node.getValue());midScan(node.getRightNode());}public AVLNode getRootNode() {return rootNode;}public static void main(String[] args) {int[] is = new int[]{10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80};//10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80AVLTree tree = new AVLTree();for(int i=0;i<is.length;i++){tree.add(is[i]);}System.out.println(tree.getRootNode().getValue());System.out.println("----------------------------");tree.midScan(tree.getRootNode());System.out.println(isBalance(tree.getRootNode()));}public static int depth(AVLNode node){if(node==null){return 0;}else{        int ld = depth(node.getLeftNode());        int rd = depth(node.getRightNode());        return 1 + (ld >rd ? ld : rd);    }}public static boolean isBalance(AVLNode node){    if (node==null)         return true;    int dis = depth(node.getLeftNode()) - depth(node.getRightNode());    if (dis>1 || dis<-1 )        return false;    else        return isBalance(node.getLeftNode()) && isBalance(node.getRightNode());}
}class AVLNode{private int value;private AVLNode leftNode;private AVLNode rightNode;private AVLNode rootNode;public int getValue() {return value;}public void setValue(int value) {this.value = value;}public AVLNode getLeftNode() {return leftNode;}public void setLeftNode(AVLNode leftNode) {this.leftNode = leftNode;if(leftNode!=null){leftNode.setRootNode(this);}}public AVLNode getRightNode() {return rightNode;}public void setRightNode(AVLNode rightNode) {this.rightNode = rightNode;if(rightNode!=null){rightNode.setRootNode(this);}}public AVLNode getRootNode() {return rootNode;}public void setRootNode(AVLNode rootNode) {this.rootNode = rootNode;}public boolean hasSubNode(){if(this.leftNode!=null||this.rightNode!=null){return true;}else{return false;}}public AVLNode(){}public AVLNode(int value){this.value = value;}
}

转载于:https://www.cnblogs.com/TomSnail/p/4379702.html

树——平衡二叉树插入和查找的JAVA实现相关推荐

  1. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统

    目录 1. 需求分析 2. 项目核心设计 2.1 结点插入 2.2 结点删除 3 测试结果 4 总结分析 4.1 调试过程中的问题是如何解决的,以及对设计与实现的回顾讨论和分析 4.2 算法的时间和空 ...

  2. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  3. 映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)

    上一篇我们手写了HashMap,还有一个很重要的Map的实现类TreeMap.打开源码第一句话:* A Red-Black tree based {@link NavigableMap} implem ...

  4. 2-3树的插入和删除操作

    注意:以下均用2-3树指代2-3查找树 2-3树的定义: 2-3树首先是一颗二叉查找树(BST树),也是一颗平衡二叉树(AVL树),所以同时包含两者的性质, 2-3树是一颗完美平衡的二叉树,也就是说所 ...

  5. AVL树的插入与删除(详解)

    AVL树的插入与删除(详解) 平衡二叉树的定义就不在这里赘述了,平衡二叉树的插入与删除都是基于平衡二叉树的查找进行的.平衡二叉树的查找和二叉树的查找又是一样的. 插入的话,我们从平衡二叉树的根结点出发 ...

  6. 目录树 删除 数据结构_数据结构:B树和B+树的插入、删除图文详解

    B树 1.1B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数.当m取2时,就是我们常见的二叉搜索树. ...

  7. 线性查找法java代码_Java线性查找和二分查找

    Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...

  8. 数据结构:B树和B+树的插入、删除图文详解

    目录 B树 1.1B树的定义 1.2B树的插入操作 1.3B树的删除操作 B+树 2.1 B+树的定义 2.2 B+树的插入操作 2.3 B+树的删除操作 B树 1.1B树的定义 B树也称B-树,它是 ...

  9. [转]B树(多向平衡查找树)详解

    B-树是对2-3树数据结构的扩展.它支持对保存在磁盘或者网络上的符号表进行外部查找,这些文件可能比我们以前考虑的输入要大的多(以前的输入能够保存在内存中). (B树和B+树是实现数据库的数据结构,一般 ...

最新文章

  1. datatable无法设置横向滚动条(设置无效)
  2. ORACLE数据库表空间备份方案
  3. html网页如何获取后台数据库的数据(html + ajax + php + mysql)
  4. 最全的测试工具以及测试需要掌握的工具
  5. 【Data guard】Failover切换
  6. 在spring-boot中使用@ConfigurationProperties
  7. RichContentLabel使用注意
  8. Linux系统基础原理
  9. MATLAB的卡尔曼滤波函数与实例
  10. python 多行注释_python 多行注释
  11. Dos攻击的方式及解决方案
  12. sql compare mysql版本_SQL Compare 13免费版
  13. 搭建资金运营体系提高企业的运营能力
  14. Android仿芝麻信用分雷达分布图
  15. 迅捷ocr文字识别软件是如何将图片转成文字的?
  16. 路由器搭设mysql_搭建mysql5.7.13环境的方法步骤
  17. web前端知识——iframe标签、CSS
  18. switch语句 计算个人所得税和税后收入
  19. MySQL数据查询(可视化界面 MySQL Workbench)
  20. 惠普电脑如何重装Linux系统,如何把惠普下的Linux操作系统换为windows 7

热门文章

  1. 怎样自动提取邮件的内容_这些最新的外贸搜索开发工具(图灵搜、谷歌搜索提取工具、易查查),你会使用吗?...
  2. http协议下需要服务器推送吗,HTTP/2.0 服务器推送实现
  3. python连不上树莓派_树莓派respberry中cmake编译链接python2.7库不成功,求教
  4. linux 打包排除多个目录,tar打包整个目录(可排除子目录)几种方法
  5. 奇迹觉醒qq服务器比微信少,十年内最大的奇迹!功能比QQ还少的微信为什么能成功?...
  6. 计算机网络整体框架理解与把握(持续更新)
  7. 工业交换机在工业通信领域的应用分析
  8. [渝粤教育] 中国地质大学 C语言程序设计(新) 复习题
  9. SX1301吞吐量是SX1276/8的多少倍?
  10. cpythonjavagolang_cpython:列表对象(PyListObject)的扩容机制