- 浏览: 599955 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。
在构造二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。这样就可以得到AVL 树。
平衡调整的4种基本类型:
AVL树及JAVA实现
运行:
C:\java>java AvlTree
Checking... (no more output means success)
源码:
在构造二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。这样就可以得到AVL 树。
平衡调整的4种基本类型:
AVL树及JAVA实现
public class AvlTree<T extends Comparable<? super T>> { private static class AvlNode<T>{//avl树节点 AvlNode( T theElement ) { this( theElement, null, null ); } AvlNode( T theElement, AvlNode<T> lt, AvlNode<T> rt ) { element = theElement; left = lt; right = rt; height = 0; } T element; // 节点中的数据 AvlNode<T> left; // 左儿子 AvlNode<T> right; // 右儿子 int height; // 节点的高度 } private AvlNode<T> root;//avl树根 public AvlTree( ) { root = null; } //在avl树中插入数据,重复数据复略 public void insert( T x ) { root = insert( x, root ); } //在avl中删除数据,没有实现 public void remove( T x ) { System.out.println( "Sorry, remove unimplemented" ); } //在avl树中找最小的数据 public T findMin( ) { if( isEmpty( ) ) throw new UnderflowException( ); return findMin( root ).element; } //在avl树中找最大的数据 public T findMax( ) { if( isEmpty( ) ) throw new UnderflowException( ); return findMax( root ).element; } //搜索 public boolean contains( T x ) { return contains( x, root ); } public void makeEmpty( ) { root = null; } public boolean isEmpty( ) { return root == null; } //排序输出avl树 public void printTree( ) { if( isEmpty( ) ) System.out.println( "Empty tree" ); else printTree( root ); } 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 );//将x插入左子树中 if( height( t.left ) - height( t.right ) == 2 )//打破平衡 if( x.compareTo( t.left.element ) < 0 )//LL型(左左型) t = rotateWithLeftChild( t ); else //LR型(左右型) t = doubleWithLeftChild( t ); } else if( compareResult > 0 ) { t.right = insert( x, t.right );//将x插入右子树中 if( height( t.right ) - height( t.left ) == 2 )//打破平衡 if( x.compareTo( t.right.element ) > 0 )//RR型(右右型) t = rotateWithRightChild( t ); else //RL型 t = doubleWithRightChild( t ); } else ; // 重复数据,什么也不做 t.height = Math.max( height( t.left ), height( t.right ) ) + 1;//更新高度 return t; } //找最小 private AvlNode<T> findMin( AvlNode<T> t ) { if( t == null ) return t; while( t.left != null ) t = t.left; return t; } //找最大 private AvlNode<T> findMax( AvlNode<T> t ) { if( t == null ) return t; while( t.right != null ) t = t.right; return t; } //搜索(查找) private boolean contains( T x, AvlNode<T> t ) { while( t != null ) { int compareResult = x.compareTo( t.element ); if( compareResult < 0 ) t = t.left; else if( compareResult > 0 ) t = t.right; else return true; // Match } return false; // No match } //中序遍历avl树 private void printTree( AvlNode<T> t ) { if( t != null ) { printTree( t.left ); System.out.println( t.element ); printTree( t.right ); } } //求高度 private int height( AvlNode<T> t ) { return t == null ? -1 : t.height; } //带左子树旋转,适用于LL型 private AvlNode<T> rotateWithLeftChild( AvlNode<T> k2 ) { AvlNode<T> 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 ), k2.height ) + 1; return k1; } //带右子树旋转,适用于RR型 private AvlNode<T> rotateWithRightChild( AvlNode<T> k1 ) { AvlNode<T> 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.right ), k1.height ) + 1; return k2; } //双旋转,适用于LR型 private AvlNode<T> doubleWithLeftChild( AvlNode<T> k3 ) { k3.left = rotateWithRightChild( k3.left ); return rotateWithLeftChild( k3 ); } //双旋转,适用于RL型 private AvlNode<T> doubleWithRightChild( AvlNode<T> k1 ) { k1.right = rotateWithLeftChild( k1.right ); return rotateWithRightChild( k1 ); } // Test program public static void main( String [ ] args ) { AvlTree<Integer> t = new AvlTree<Integer>( ); final int NUMS = 4000; final int GAP = 37; System.out.println( "Checking... (no more output means success)" ); for( int i = GAP; i != 0; i = ( i + GAP ) % NUMS ) t.insert( i ); if( NUMS < 40 ) t.printTree( ); if( t.findMin( ) != 1 || t.findMax( ) != NUMS - 1 ) System.out.println( "FindMin or FindMax error!" ); for( int i = 1; i < NUMS; i++ ) if( !t.contains( i ) ) System.out.println( "Find error1!" ); } }
运行:
C:\java>java AvlTree
Checking... (no more output means success)
源码:
- avltree.zip (1.9 KB)
- 下载次数: 17
发表评论
-
求二叉树上任意两个节点的最近公共父节点
2013-01-09 10:24 2389北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 1984import java.util.*; ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1885POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1395接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2464当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1818关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1803关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1816关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1769一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2089POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2567设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2111继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2541继续上文http://128kj.iteye. ... -
线段树入门学习(兼解HDU1754)
2012-11-30 11:24 2690先看网上的介绍: 线段树也叫区间树,顾名思义,线段树是 ... -
图解平衡二叉树
2012-11-26 11:34 2059形态匀称的二叉树 ... -
深度优先遍历字典树(统计单词出现的个数)
2012-11-23 22:18 2848例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百 ... -
学习使用字典树(JAVA)
2012-11-22 09:25 2126字典树 又称单词 ... -
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
2012-11-17 21:50 18695堆有最大堆和最小堆之分,最大堆就是每个节点的值都>= ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4043一、什么是并查集 ... -
根据二叉树前序遍历和中序遍历的结果输出后序遍历(java)
2012-10-07 19:58 3328前序遍历的第一个元素为根节点,在中序遍历中找到这个根节点 ...
相关推荐
基于java语言手动实现的AVL树代码,该树形结构适用于查找,实现的逻辑可以查看博主的原创作品《用JAVA代码手动实现AVL树》
AVL树的平衡性比红黑树更强,因此在查找效率上通常优于红黑树,但插入和删除操作可能需要更多的旋转,导致更复杂的实现。红黑树的平衡要求相对较宽松,插入和删除操作的代价较低,且在实践中表现良好,是许多语言...
在"AVL树的细节实现_软件设计三班_郭威_1615925218"这个文件中,郭威同学可能详细阐述了AVL树的基本概念,详细描述了插入和删除操作的过程,并给出了相应的C++或Java代码实现。此外,他还可能进行了性能分析和对比...
在这个主题中,我们将探讨三种特殊的树类型:排序二叉树、AVL树和哈夫曼树,以及如何使用Java语言来实现它们的基本操作,如增、删、改、查。 首先,排序二叉树(Sorted Binary Tree)是一种特殊的二叉树,其中每个...
6. Java编程:使用Java实现AVL树的优势在于,Java提供了强大的集合框架和图形用户界面库(如Swing或JavaFX),使得开发这样的项目变得相对容易。通过Java代码,我们可以清晰地看到数据结构和算法的实现,同时利用...
在`avl_tree`这个文件中,很可能包含了AVL树的C++、Java或Python等编程语言的实现,包括节点定义、插入、删除和以括号表示法输出等功能。通过阅读和理解这些代码,你可以深入学习AVL树的工作原理和实际应用。
这段 Java 代码实现了一个 AVL 树(平衡二叉搜索树)的数据结构。 **类和内部类**: * `AVLTree`:主类,包含 AVL 树的操作方法和属性。 * `TreeNode`:内部类,代表 AVL 树的节点,包含节点值、左右子树指针、父...
在Java中实现AVL树,可以使用Java的内置数据结构如`java.util.TreeMap`,它在内部维护了一个平衡的红黑树,性能接近AVL树。但如果你想直接操作AVL树,可以自定义数据结构并实现相关的旋转和平衡算法。
在Java编程语言中实现AVL树,通常会定义一个Node类来表示树的节点,包含关键字、左子节点、右子节点以及节点的平衡因子。平衡因子是节点的左子树高度减去右子树高度,用于判断和调整树的平衡状态。当平衡因子绝对值...
在windows visual c++ 6.0可以运行 是AVL树的一个非递归实现
本文将详细介绍Java中AVL平衡二叉树实现Map的知识点,以便读者更好地理解和应用AVL树在Java中的实现。 一、AVL树的概念和特点 AVL树是一种自平衡二叉搜索树,它的特点是所有叶节点的高度相差不超过1,它可以在O...
在提供的`Drzewo_Avl.java`文件中,可以预期代码会包含AVL树的基本操作,如节点的创建、插入、删除以及平衡旋转的实现。这些方法通常包括: 1. `insert(int key)`: 插入一个新节点,如果插入导致不平衡,需要调用...
在实际应用中,为了避免二叉排序树退化,可以采用平衡二叉树,如AVL树或红黑树。这些平衡二叉树在每次插入或删除后都会自动调整,以确保树的高度保持在一个较小的范围内,从而保证操作效率。 总之,二叉排序树是...
了解和掌握AVL树的原理和实现细节对于提升Java开发者的数据结构和算法能力大有裨益。在阅读和学习这些代码时,可以通过单元测试来验证各种操作的正确性,并尝试分析不同操作对树结构的影响。同时,也可以对比其他自...
"avl_tree"这个文件可能包含了一些关于AVL树的实现代码,例如C++、Java或Python等语言的实现,这些代码通常会展示如何创建AVL树,插入、删除节点以及进行旋转操作的细节。而"www.pudn.com.txt"可能是提供有关AVL树的...
在提供的"AVL.java"文件中,可能包含了实现AVL树的基本数据结构和相关操作的Java代码。这些操作通常包括构造函数、插入方法、删除方法、查找方法、以及平衡调整的旋转方法。通过阅读和理解这段代码,你可以深入学习...
在实际编程实现中,学生可能会用C++、Java或其他编程语言编写AVL树的节点结构、插入、删除、查找和平衡调整等函数,同时考虑边界条件和异常处理,确保代码的完整性和正确性。通过这个作业,学生不仅能深入理解AVL树...
AVL树Java中的AVL树实现有两个基本操作,使用这些操作树本身会保持平衡。 左旋转。 右旋。 然后将有四种可能性左-左情况:— x是y的左子代,y是z的左子代。 左右案例:— x是y的右子代,y是z的左子代。 左右案例:—...