文章目录

  • 一、AVL树
  • 二、代码实现(Java)

一、AVL树

二、代码实现(Java)

import java.nio.BufferUnderflowException;/*** @author LongRookie* @description: AVL ,满足平衡条件的二叉查找树* @date 2021/6/27 16:38*/
public class AVL<AnyType extends Comparable<? super AnyType>> {/*** The statement of node in AVL Tree** @param <AnyType>*/private static class AvlNode<AnyType> {//ConstructorsAvlNode(AnyType element) {this(element, null, null);}AvlNode(AnyType theElement, AvlNode<AnyType> lt, AvlNode<AnyType> rt) {element = theElement;left = lt;right = rt;height = 0;}AnyType element; //The data in the nodeAvlNode<AnyType> left; //Left childAvlNode<AnyType> right; //Right childint height; //Height}public AvlNode<AnyType> root;//Constructorpublic AVL() {root = null;}//findMaxpublic AnyType findMax() {if (isEmpty()) throw new BufferUnderflowException();return findMax(root).element;}//findMinpublic AnyType findMin() {if (isEmpty()) throw new BufferUnderflowException();return findMin(root).element;}//insertpublic void insert(AnyType x) {root = insert(x, root);}//removepublic void remove(AnyType x) {root = remove(x,root);}//containpublic boolean contains(AnyType x){return contains(x,root);}private boolean contains(AnyType x, AvlNode<AnyType> t) {if (t == null) {return false;}int compareResult = x.compareTo(t.element);if (compareResult < 0) {return contains(x, t.left);} else if (compareResult > 0) {return contains(x, t.right);} else {return true;}}private boolean isEmpty() {return root == null;}private AvlNode<AnyType> insert(AnyType x, AvlNode<AnyType> t) {if (t == null) {return new AvlNode<AnyType>(x);}int compareResult = x.compareTo(t.element);if (compareResult < 0) {t.left = insert(x, t.left);} else if (compareResult > 0) {t.right = insert(x, t.right);} else; //Duplicate; do nothingreturn t;}private static final int ALLOWED_IMBALANCE = 1;/*** Assume t is either balanced or within one of being balanced** @param t* @return*/private AvlNode<AnyType> balance(AvlNode<AnyType> t) {// useless in insert operation;if (t == null) {return t;}// if the height of subtree t is larger than that of right subtree;if (height(t.left) - height(t.right) > ALLOWED_IMBALANCE) {// notice the '=' calculation ,when only insert ,that is useless;// when remove,that is possibly useful;if (height(t.left.left) >= height(t.left.right)) {t = rotateWithLeftChild(t);} else {t = doubleWithLeftChild(t);}} else if (height(t.right) - height(t.left) > ALLOWED_IMBALANCE) {if (height(t.right.right) >= height(t.right.left)) {t = rotateWithRightChild(t);} else {t = doubleWithRightChild(t);}}//update the height, the operate is useful for the node that does not need to balance;t.height = Math.max(height(t.left), height(t.right)) + 1;return t;}/*** Rotate binary tree node with left child* For AVL trees ,this is a single rotation for case 1* Update heights ,then return new root** @param k2* @return*/private AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType> k2) {AvlNode<AnyType> k1 = k2.left;k2.left = k1.right;k1.right = k2;k2.height = Math.max(height(k2.left), height(k2.right)) + 1;k1.height = Math.max(height(k1.left), height(k1.right)) + 1;return k1;}/*** Rotate binary tree node with right child* For AVL trees ,this is a single rotation for case 4* Update heights ,then return new root** @param k1* @return*/private AvlNode<AnyType> rotateWithRightChild(AvlNode<AnyType> k1) {AvlNode<AnyType> k2 = k1.right;k1.right = k2.left;k2.left = k1;k1.height = Math.max(height(k1.left), height(k1.right)) + 1;k2.height = Math.max(height(k2.left), height(k2.right)) + 1;return k2;}/*** Double rotate binary tree node;first left child* with its right child; then node k3 with new left child.* For AVL trees, this is a double rotation for case 2.* Update heights , then return new root.** @param k3* @return*/private AvlNode<AnyType> doubleWithLeftChild(AvlNode<AnyType> k3) {k3.left = rotateWithRightChild(k3.left);return rotateWithLeftChild(k3);}/*** Double rotate binary tree node;first right child* with its left child; then node k3 with new right child.* For AVL trees, this is a double rotation for case 3.* Update heights , then return new root.** @param k3* @return*/private AvlNode<AnyType> doubleWithRightChild(AvlNode<AnyType> k3) {k3.right = rotateWithLeftChild(k3.right);return rotateWithRightChild(k3);}/*** Return the height of node t, or -1, if null;** @param t node* @return*/private int height(AvlNode<AnyType> t) {return t == null ? -1 : t.height;}/*** Internal method to find the node containing the smallest item in a subtree** @param t the node that roots the subtree* @return the node containing the smallest item*/private AvlNode<AnyType> findMin(AvlNode<AnyType> t) {if (t == null) {return null;}if (t.left == null) {return t;}return findMin(t.left);}/*** Internal method to find the node containing the largest item in a subtree** @param t the node that roots the subtree* @return the node containing the largest item*/private AvlNode<AnyType> findMax(AvlNode<AnyType> t) {if (t == null) {return null;}if (t.right == null) {return t;}return findMax(t.right);}private AvlNode<AnyType> remove(AnyType x, AvlNode<AnyType> t) {if (t == null) {return t; // Item not found; do nothing}int compareResult = x.compareTo(t.element);if (compareResult < 0) {t.left = remove(x, t.left);} else if (compareResult > 0) {t.right = remove(x, t.right);} else if (t.left != null && t.right != null) {//Two childrent.element = findMin(t.right).element; //the smallest item in right subtreet.right = remove(t.element, t.right);} elset = (t.left != null) ? t.left : t.right;return balance(t);}}

AVL树(Java实现)相关推荐

  1. AVL树----java

                                                                                        AVL树----java AVL ...

  2. avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现

    平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现 标签:#二叉树##数据结构##自平衡二叉树# 时间:2018/10/27 09:30:01 作者 ...

  3. AVL树-自平衡二叉查找树(Java实现)

    在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An alg ...

  4. 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

    二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...

  5. 【数据结构与算法】AVL树的Java实现

    前情提要 之前只写了一些AVL树核心算法,这里给出一个AVL树的完整实现. AVL树是平衡查找二叉树,不仅能避免二叉搜索树出现斜树的状况,更是能保持比较标准的O(log2N),但AVL树可能需要很多次 ...

  6. 【数据结构与算法】AVL树核心算法的Java实现

    定义AVL树结点 public class AvlNode<T> {/*** 数据元素*/T element;/*** 结点高度*/int height;/*** 结点左儿子*/AvlNo ...

  7. java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码

    普通二叉查找树的问题   在开篇,我们提到过,普通二叉树(二叉查找树)在操作的时间复杂度上不一定遵循O(㏒n),也有可能是O(n),这是为什么呢?在上一篇中,我们明明插入都按照一定规则比较的呀,其实那 ...

  8. 构造avl树_图解 AVL 自平衡二叉查找树及 java 实现

    思维导图 AVL树 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的. 它是最先发明的自平衡二叉查找树(Self-balancing binary sear ...

  9. Java数据结构——平衡二叉树(AVL树)

    AVL树的引入 搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以下极端情况: 这样的二叉树搜索效率甚至比链表还低.在搜索二叉树基础上出现的平衡二叉树(AVL树)就解决了这样的问题.当平衡二叉树(A ...

最新文章

  1. pip无法更新_TensorFlow 2.0开发者测试版发布!每晚更新
  2. matlab实现定标旋转,Matlab摄像机标定工具箱的使用说明精编.doc
  3. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
  4. 关于异地高考引发的又一次舆论攻势
  5. UVa11137 Ingenuous Cubrency
  6. 单片机实现环形队列_稀疏数组和队列(二)
  7. 鸿蒙系统有那些上市,鸿蒙上市整套系统究竟意味着什么
  8. RANSAC估计——以直线拟合为例
  9. ZeroMQ(java)之负载均衡
  10. Ant + Jenkies +Tomcat 自动构建部署Web项目
  11. Unlocker-最好的顽固文件删除工具使用说明
  12. css画钟表_css3实现钟表效果
  13. 编程猫海龟编辑器(python)_编程猫海龟编辑器
  14. python——文件的IO操作(IO==InputOutput)
  15. line 1: syntax error: unexpected (
  16. 复习单片机:点亮LED(内含实物图+硬件设计+软件编程+原始代码)
  17. ZYNQ | 开发工具
  18. Java core 包_JD-Core
  19. 10分钟看懂Docker和K8S,docker k8s 区别(生动形象,清晰易懂)
  20. 基于Java的聊天系统设计

热门文章

  1. Java SE 6之GUI:让界面更加绚丽(下)
  2. [图论]最短路计数(spfa)
  3. Java读取word中表格
  4. 将m个苹果放入n个盘子的问题【转】
  5. 巧用推荐墙入口,APP轻松盈利
  6. Android Debug Bridge 技术实现原理
  7. 大数据?这些你了解吗?------之基础知识篇
  8. SQL Server多实例环境搭建与连接
  9. ymodem传输的终端工具_Serial for Mac(现代化的终端设计软件)
  10. 寻路的几种算法_Godot游戏开发实践之二:AI之寻路新方式