`

AVL平衡树(java实现)

阅读更多
public class AVLTree<T extends Comparable<? super T>> {

	/**
	 * 根节点
	 */
	private AvlNode<T> root;

	/**
	 * 插入
	 * 
	 * @timestamp Mar 5, 2016 6:31:53 PM
	 * @param x
	 */
	public void insert(T x) {
		root = insert(x, root);
	}

	/**
	 * 删除
	 * 
	 * @timestamp Mar 5, 2016 3:44:42 PM
	 * @param x
	 */
	public void remove(T x) {
		root = remove(x, root);
	}

	/**
	 * 打印
	 * 
	 * @timestamp Mar 5, 2016 7:00:22 PM
	 */
	public void printTree() {
		if (isEmpty())
			System.out.println("Empty tree");
		else
			printTree(root);
	}

	/**
	 * 是否为空
	 * 
	 * @timestamp Mar 5, 2016 4:21:26 PM
	 * @return
	 */
	public boolean isEmpty() {
		return root == null;
	}

	/**
	 * 中序遍历
	 * 
	 * @timestamp Mar 5, 2016 4:22:19 PM
	 * @param t
	 */
	private void printTree(AvlNode<T> t) {
		if (t != null) {
			printTree(t.left);
			System.out.print(t.element + " ,");
			printTree(t.right);
		}
	}

	/**
	 * 删除
	 * 
	 * @timestamp Mar 5, 2016 3:44:53 PM
	 * @param x
	 * @param t
	 * @return
	 */
	private AvlNode<T> remove(T x, AvlNode<T> t) {
		if (t == null)
			return t;

		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) {
			t.element = findMin(t.right).element;
			t.right = remove(t.element, t.right);
		} else
			t = (t.left != null) ? t.left : t.right;
		return t;
	}

	private AvlNode<T> findMin(AvlNode<T> t) {
		if (t == null)
			return null;
		else if (t.left == null)
			return t;
		return findMin(t.left);
	}

	/**
	 * 实际插入
	 * 
	 * @timestamp Mar 5, 2016 6:35:02 PM
	 * @param x
	 * @param t
	 * @return
	 */
	private AvlNode<T> insert(T x, AvlNode<T> t) {
		if (t == null)
			return new AvlNode<T>(x, null, null);

		int compareResult = x.compareTo(t.element);

		if (compareResult < 0) {// 左边
			t.left = insert(x, t.left);
			if (height(t.left) - height(t.right) == 2) {// 如果两遍深度相差大于1
				if (x.compareTo(t.left.element) < 0)
					t = rotateWithLeftChild(t);// 左旋
				else
					t = doubleWithLeftChild(t);// 双旋
			}
		} else if (compareResult > 0) {// 右边
			t.right = insert(x, t.right);
			if (height(t.right) - height(t.left) == 2) {// 如果两遍深度相差大于1
				if (x.compareTo(t.right.element) > 0)
					t = rotateWithRightChild(t);// 右旋
				else
					t = doubleWithRightChild(t);// 双旋
			}
		} else
			; // 数据重复
		t.height = Math.max(height(t.left), height(t.right)) + 1;// 重定义高度
		return t;
	}

	/**
	 * 旋转右孩子
	 * 
	 * @timestamp Mar 5, 2016 7:19:09 PM
	 * @param k1
	 * @return
	 */
	private AvlNode<T> rotateWithRightChild(AvlNode<T> k1) {
		AvlNode<T> k2 = k1.right;// k1代表父节点,k2代表父节点的右孩子
		k1.right = k2.left;// 孩子节点的左孩子 --> 父节点的右孩子
		k2.left = k1;// 父节点 --> 孩子的左节点
		k1.height = Math.max(height(k1.left), height(k1.right)) + 1;
		k2.height = Math.max(height(k2.right), k1.height) + 1;// 重定义高度
		return k2;
	}

	/**
	 * 旋转左孩子
	 * 
	 * @timestamp Mar 5, 2016 7:18:55 PM
	 * @param k2
	 * @return
	 */
	private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2) {
		AvlNode<T> k1 = k2.left;// k2代表父节点,k1代表父节点的左孩子
		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), k2.height) + 1;// 重定义高度
		return k1;
	}

	/**
	 * 双向旋转左孩子
	 * 
	 * @timestamp Mar 5, 2016 7:19:42 PM
	 * @param k3
	 * @return
	 */
	private AvlNode<T> doubleWithLeftChild(AvlNode<T> k3) {
		k3.left = rotateWithRightChild(k3.left);// 传入父节点的左孩子节点
		return rotateWithLeftChild(k3);
	}

	/**
	 * 双向旋转右孩子
	 * 
	 * @timestamp Mar 5, 2016 7:32:56 PM
	 * @param k1
	 * @return
	 */
	private AvlNode<T> doubleWithRightChild(AvlNode<T> k1) {
		k1.right = rotateWithLeftChild(k1.right);// 传入父节点的右孩子节点
		return rotateWithRightChild(k1);
	}

	/**
	 * 获取深度,没有返回-1
	 * 
	 * @timestamp Mar 5, 2016 6:41:18 PM
	 * @param t
	 * @return
	 */
	private int height(AvlNode<T> t) {
		return t == null ? -1 : t.height;
	}

	/**
	 * 节点
	 * 
	 * @timestamp Mar 5, 2016 6:36:41 PM
	 * @author smallbug
	 * @param <E>
	 */
	private static class AvlNode<E> {

		AvlNode(E theElement, AvlNode<E> lt, AvlNode<E> rt) {
			element = theElement;
			left = lt;
			right = rt;
			height = 0;
		}

		E element; // 数据
		AvlNode<E> left; // 左孩子
		AvlNode<E> right; // 右孩子
		int height; // 深度
	}

	public static void main(String[] args) {
		AVLTree<Integer> t = new AVLTree<>();
		t.insert(3);
		t.insert(2);
		t.insert(1);
		t.insert(4);
		t.insert(5);
		t.insert(6);
		t.insert(7);
		t.insert(10);
		t.insert(9);
		t.insert(8);
		t.printTree();
		System.out.println();
		t.remove(8);
		t.printTree();
	}
}

 

0
2
分享到:
评论

相关推荐

    AVL树及JAVA实现

    AVL树是一种自平衡二叉查找树(BST),由G....`AvlTree.java`和`UnderflowException.java`文件分别展示了AVL树的Java实现和异常处理机制。理解和掌握AVL树的原理与实现,对于提升数据结构和算法能力至关重要。

    Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1

    "Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1" 本文将详细介绍Java中AVL平衡二叉树实现Map的知识点,以便读者更好地理解和应用AVL树在Java中的实现。 一、AVL树的概念和特点 AVL树是一种自平衡二叉搜索...

    红黑树和AVL树的实现

    AVL树的平衡性比红黑树更强,因此在查找效率上通常优于红黑树,但插入和删除操作可能需要更多的旋转,导致更复杂的实现。红黑树的平衡要求相对较宽松,插入和删除操作的代价较低,且在实践中表现良好,是许多语言...

    AVL树的细节实现_课程设计文档+代码

    在"AVL树的细节实现_软件设计三班_郭威_1615925218"这个文件中,郭威同学可能详细阐述了AVL树的基本概念,详细描述了插入和删除操作的过程,并给出了相应的C++或Java代码实现。此外,他还可能进行了性能分析和对比...

    使用Java实现平衡二叉树(AVL树)

    这段 Java 代码实现了一个 AVL 树(平衡二叉搜索树)的数据结构。 **类和内部类**: * `AVLTree`:主类,包含 AVL 树的操作方法和属性。 * `TreeNode`:内部类,代表 AVL 树的节点,包含节点值、左右子树指针、父...

    排序二叉树 AVL树 哈夫曼树增删改查Java实现

    在这个主题中,我们将探讨三种特殊的树类型:排序二叉树、AVL树和哈夫曼树,以及如何使用Java语言来实现它们的基本操作,如增、删、改、查。 首先,排序二叉树(Sorted Binary Tree)是一种特殊的二叉树,其中每个...

    java-平衡二叉树AVL的实现

    3. **AVLTree.java**:这是AVL树的主要实现,可能包含了构造函数、插入、删除和平衡操作。在插入新节点时,需要检查并调整树的平衡状态,可能涉及旋转操作。删除操作更为复杂,需要处理多种情况,包括删除叶子节点、...

    avl树的实现

    2. **平衡调整**:插入后检查新节点的父节点的平衡因子,如果超过1,则需要进行旋转操作来重新平衡树。 AVL树的删除操作: 1. **找到待删除节点**:如同搜索操作,找到要删除的节点。 2. **处理删除节点**:根据...

    AVL树操作图形界面

    6. Java编程:使用Java实现AVL树的优势在于,Java提供了强大的集合框架和图形用户界面库(如Swing或JavaFX),使得开发这样的项目变得相对容易。通过Java代码,我们可以清晰地看到数据结构和算法的实现,同时利用...

    AVL树树树树树

    2. 自动平衡:当插入或删除节点导致平衡因子超出这个范围时,需要通过旋转操作来重新平衡树。AVL树的旋转操作主要有四种:左旋、右旋、左右旋和右左旋。 **查找操作**: 在AVL树中进行查找操作类似于普通的二叉搜索...

    红黑树、二叉平衡树、二叉排序树的java实现

    本项目涵盖了三种重要的树形数据结构的Java实现:红黑树(RBTree)、二叉平衡树(AVLTree)以及二叉排序树(BSTree)。这些数据结构在处理大量数据时,能够提供高效的插入、删除和查找操作,广泛应用于数据库索引、...

    数据结构二叉平衡树课程设计

    - 实现一个二叉平衡树的课程设计可能包括理解基本概念、编写数据结构表示节点、实现插入、删除和查找操作,以及平衡调整算法。 - 可以选择AVL树或红黑树作为项目,编写C++或Java代码,并通过测试用例验证其正确性...

    Avl_tree.rar_avl_avl java_avl tree_tree

    在提供的`Drzewo_Avl.java`文件中,可以预期代码会包含AVL树的基本操作,如节点的创建、插入、删除以及平衡旋转的实现。这些方法通常包括: 1. `insert(int key)`: 插入一个新节点,如果插入导致不平衡,需要调用...

    Java实现二叉排序树

    在实际应用中,为了避免二叉排序树退化,可以采用平衡二叉树,如AVL树或红黑树。这些平衡二叉树在每次插入或删除后都会自动调整,以确保树的高度保持在一个较小的范围内,从而保证操作效率。 总之,二叉排序树是...

    平衡树实验报告完整版

    实验报告中可能包含了平衡树的C++或Java等编程语言实现,这通常涉及到节点结构定义、插入、删除和查找函数的编写,以及相应的旋转操作函数。通过阅读代码,可以更深入理解平衡树的内部工作原理。 五、运行程序 李辉...

    二叉平衡树java代码,有注释能直接运行

    在这个Java实现中,我们主要关注AVL树,它是最常见的平衡二叉搜索树之一。 在AVL树中,每个节点都包含一个平衡因子,该因子是其左子树的高度减去右子树的高度。当平衡因子的绝对值大于1时,就需要进行旋转操作来...

    avl_tree.rar_AVL树_avl

    "avl_tree"这个文件可能包含了一些关于AVL树的实现代码,例如C++、Java或Python等语言的实现,这些代码通常会展示如何创建AVL树,插入、删除节点以及进行旋转操作的细节。而"www.pudn.com.txt"可能是提供有关AVL树的...

    数据结构与算法的一些实例,数据结构包括图(遍历算法)、树(哈夫曼树、AVL平衡树等)

    AVL树则是一种自平衡二叉搜索树,其特点是任何节点的两个子树的高度差不超过1,这确保了插入和删除操作的平均时间复杂度为O(log n)。 接着,我们来看看图。图是一种非线性的数据结构,由顶点和边组成,用于表示对象...

    java数据结构与算法之平衡二叉树AVL树的设计与实现分析.doc

    java数据结构与算法之平衡二叉树AVL树的设计与实现分析.doc

    基于java实现的平衡二叉树源码.zip

    在给定的压缩包"基于java实现的平衡二叉树源码.zip"中,可能包含了AVL树或红黑树的Java实现。`README.md`文件通常会提供项目的简介、如何构建和运行代码的指导,以及任何依赖项的说明。`pom.xml`文件是Maven项目对象...

Global site tag (gtag.js) - Google Analytics