`
128kj
  • 浏览: 601190 次
  • 来自: ...
社区版块
存档分类
最新评论

AVL树及JAVA实现

阅读更多
  一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。

  在构造二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。这样就可以得到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)

源码:
分享到:
评论

相关推荐

    基于java语言手动实现的AVL树代码

    基于java语言手动实现的AVL树代码,该树形结构适用于查找,实现的逻辑可以查看博主的原创作品《用JAVA代码手动实现AVL树》

    红黑树和AVL树的实现

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

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

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

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

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

    AVL树操作图形界面

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

    avl树的实现

    在`avl_tree`这个文件中,很可能包含了AVL树的C++、Java或Python等编程语言的实现,包括节点定义、插入、删除和以括号表示法输出等功能。通过阅读和理解这些代码,你可以深入学习AVL树的工作原理和实际应用。

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

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

    AVL树树树树树

    在Java中实现AVL树,可以使用Java的内置数据结构如`java.util.TreeMap`,它在内部维护了一个平衡的红黑树,性能接近AVL树。但如果你想直接操作AVL树,可以自定义数据结构并实现相关的旋转和平衡算法。

    AVL树课程设计(演示程序)

    在Java编程语言中实现AVL树,通常会定义一个Node类来表示树的节点,包含关键字、左子节点、右子节点以及节点的平衡因子。平衡因子是节点的左子树高度减去右子树高度,用于判断和调整树的平衡状态。当平衡因子绝对值...

    AVL树的一个非递归实现

    在windows visual c++ 6.0可以运行 是AVL树的一个非递归实现

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

    本文将详细介绍Java中AVL平衡二叉树实现Map的知识点,以便读者更好地理解和应用AVL树在Java中的实现。 一、AVL树的概念和特点 AVL树是一种自平衡二叉搜索树,它的特点是所有叶节点的高度相差不超过1,它可以在O...

    Avl_tree.rar_avl_avl java_avl tree_tree

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

    Java实现二叉排序树

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

    java-平衡二叉树AVL的实现

    了解和掌握AVL树的原理和实现细节对于提升Java开发者的数据结构和算法能力大有裨益。在阅读和学习这些代码时,可以通过单元测试来验证各种操作的正确性,并尝试分析不同操作对树结构的影响。同时,也可以对比其他自...

    avl_tree.rar_AVL树_avl

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

    AVL.rar_AVL树_avl_avl树源代码

    在提供的"AVL.java"文件中,可能包含了实现AVL树的基本数据结构和相关操作的Java代码。这些操作通常包括构造函数、插入方法、删除方法、查找方法、以及平衡调整的旋转方法。通过阅读和理解这段代码,你可以深入学习...

    AVL_tree.rar_AVL树_avl

    在实际编程实现中,学生可能会用C++、Java或其他编程语言编写AVL树的节点结构、插入、删除、查找和平衡调整等函数,同时考虑边界条件和异常处理,确保代码的完整性和正确性。通过这个作业,学生不仅能深入理解AVL树...

    AVLTrees:Java中的AVL树实现

    AVL树Java中的AVL树实现有两个基本操作,使用这些操作树本身会保持平衡。 左旋转。 右旋。 然后将有四种可能性左-左情况:— x是y的左子代,y是z的左子代。 左右案例:— x是y的右子代,y是z的左子代。 左右案例:—...

Global site tag (gtag.js) - Google Analytics