AVL树(Java实现)
文章目录
- 一、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实现)相关推荐
- AVL树----java
AVL树----java AVL ...
- avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现
平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现 标签:#二叉树##数据结构##自平衡二叉树# 时间:2018/10/27 09:30:01 作者 ...
- AVL树-自平衡二叉查找树(Java实现)
在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An alg ...
- 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)
二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...
- 【数据结构与算法】AVL树的Java实现
前情提要 之前只写了一些AVL树核心算法,这里给出一个AVL树的完整实现. AVL树是平衡查找二叉树,不仅能避免二叉搜索树出现斜树的状况,更是能保持比较标准的O(log2N),但AVL树可能需要很多次 ...
- 【数据结构与算法】AVL树核心算法的Java实现
定义AVL树结点 public class AvlNode<T> {/*** 数据元素*/T element;/*** 结点高度*/int height;/*** 结点左儿子*/AvlNo ...
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码
普通二叉查找树的问题 在开篇,我们提到过,普通二叉树(二叉查找树)在操作的时间复杂度上不一定遵循O(㏒n),也有可能是O(n),这是为什么呢?在上一篇中,我们明明插入都按照一定规则比较的呀,其实那 ...
- 构造avl树_图解 AVL 自平衡二叉查找树及 java 实现
思维导图 AVL树 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的. 它是最先发明的自平衡二叉查找树(Self-balancing binary sear ...
- Java数据结构——平衡二叉树(AVL树)
AVL树的引入 搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以下极端情况: 这样的二叉树搜索效率甚至比链表还低.在搜索二叉树基础上出现的平衡二叉树(AVL树)就解决了这样的问题.当平衡二叉树(A ...
最新文章
- pip无法更新_TensorFlow 2.0开发者测试版发布!每晚更新
- matlab实现定标旋转,Matlab摄像机标定工具箱的使用说明精编.doc
- 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
- 关于异地高考引发的又一次舆论攻势
- UVa11137 Ingenuous Cubrency
- 单片机实现环形队列_稀疏数组和队列(二)
- 鸿蒙系统有那些上市,鸿蒙上市整套系统究竟意味着什么
- RANSAC估计——以直线拟合为例
- ZeroMQ(java)之负载均衡
- Ant + Jenkies +Tomcat 自动构建部署Web项目
- Unlocker-最好的顽固文件删除工具使用说明
- css画钟表_css3实现钟表效果
- 编程猫海龟编辑器(python)_编程猫海龟编辑器
- python——文件的IO操作(IO==InputOutput)
- line 1: syntax error: unexpected (
- 复习单片机:点亮LED(内含实物图+硬件设计+软件编程+原始代码)
- ZYNQ | 开发工具
- Java core 包_JD-Core
- 10分钟看懂Docker和K8S,docker k8s 区别(生动形象,清晰易懂)
- 基于Java的聊天系统设计