美文网首页
[Java]BST树 插入 删除

[Java]BST树 插入 删除

作者: AkuRinbu | 来源:发表于2018-10-04 23:30 被阅读69次

    代码出处

    https://users.cs.fiu.edu/~weiss/

    各种实现

    • Java实现

    Data Structures and Algorithm Analysis in Java (Third Edition)
    CS-7 Text
    https://users.cs.fiu.edu/~weiss/dsaajava3/code/
    Fig02_09.java: Test program for binary search
    BinarySearchTree.java: Binary search tree

    测试运行

    • 源码文件:BinarySearchTree.java 以及Fig02_09.java(放置到同一个文件夹下面)
    • 编译运行:
    > cd bst
    > ls
    BinarySearchTree.java
    Fig02_09.java
    
    > javac Fig02_09.java
    > java Fig02_09
    Found 0 at 0
    Found 1 at -1
    Found 2 at 1
    Found 3 at -1
    Found 4 at 2
    Found 5 at -1
    Found 6 at 3
    Found 7 at -1
    Found 8 at 4
    Found 9 at -1
    Found 10 at 5
    Found 11 at -1
    Found 12 at 6
    Found 13 at -1
    Found 14 at 7
    Found 15 at -1
    

    算法分析

    删除操作 remove

    3种情况

    • Case 1 : 要删除的结点,本身是一个叶子结点,直接删除即可;

    • Case 2:要删除的结点,只有一个孩子,让其父结点指向其孩子结点即可;

      删除 结点4,结点4只有一个孩子结点
    • Case 3:要删除的结点,有两个孩子,先用其右子树最小数据替换该结点,然后递归地删除那个最小数据的结点(这个最小数据结点一定是没有左孩子的);

      删除 结点2,结点2 有两个孩子结点

    remove 实现

        /**
         * Internal method to remove from a subtree.
         * @param x the item to remove.
         * @param t the node that roots the subtree.
         * @return the new root of the subtree.
         */
        private BinaryNode<AnyType> remove( AnyType x, BinaryNode<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 children
            {
                t.element = findMin( t.right ).element;
                t.right = remove( t.element, t.right );
            }
            else
                t = ( t.left != null ) ? t.left : t.right;
            return t;
        }
    
        /**
         * Internal method to find the smallest item in a subtree.
         * @param t the node that roots the subtree.
         * @return node containing the smallest item.
         */
        private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t )
        {
            if( t == null )
                return null;
            else if( t.left == null )
                return t;
            return findMin( t.left );
        }
    
       
    

    完整源码

    测试代码 Fig02_09.java

    public class Fig02_09
    {
        public static final int NOT_FOUND = -1;
    
        /**
         * Performs the standard binary search.
         * @return index where item is found, or -1 if not found
         */
        public static <AnyType extends Comparable<? super AnyType>>
        int binarySearch( AnyType [ ] a, AnyType x )
        {
            int low = 0, high = a.length - 1;
    
            while( low <= high )
            {
                int mid = ( low + high ) / 2;
    
                if( a[ mid ].compareTo( x ) < 0 )
                    low = mid + 1;
                else if( a[ mid ].compareTo( x ) > 0 )
                    high = mid - 1;
                else
                    return mid;   // Found
            }
            return NOT_FOUND;     // NOT_FOUND is defined as -1
        }
    
        // Test program
        public static void main( String [ ] args )
        {
            int SIZE = 8;
            Integer [ ] a = new Integer [ SIZE ];
            for( int i = 0; i < SIZE; i++ )
                a[ i ] = i * 2;
    
            for( int i = 0; i < SIZE * 2; i++ )
                System.out.println( "Found " + i + " at " + binarySearch( a, i ) );
        }
    }
    

    BST BinarySearchTree.java

    // BinarySearchTree class
    //
    // CONSTRUCTION: with no initializer
    //
    // ******************PUBLIC OPERATIONS*********************
    // void insert( x )       --> Insert x
    // void remove( x )       --> Remove x
    // boolean contains( x )  --> Return true if x is present
    // Comparable findMin( )  --> Return smallest item
    // Comparable findMax( )  --> Return largest item
    // boolean isEmpty( )     --> Return true if empty; else false
    // void makeEmpty( )      --> Remove all items
    // void printTree( )      --> Print tree in sorted order
    // ******************ERRORS********************************
    // Throws UnderflowException as appropriate
    
    /**
     * Implements an unbalanced binary search tree.
     * Note that all "matching" is based on the compareTo method.
     * @author Mark Allen Weiss
     */
    public class BinarySearchTree<AnyType extends Comparable<? super AnyType>>
    {
        /**
         * Construct the tree.
         */
        public BinarySearchTree( )
        {
            root = null;
        }
    
        /**
         * Insert into the tree; duplicates are ignored.
         * @param x the item to insert.
         */
        public void insert( AnyType x )
        {
            root = insert( x, root );
        }
    
        /**
         * Remove from the tree. Nothing is done if x is not found.
         * @param x the item to remove.
         */
        public void remove( AnyType x )
        {
            root = remove( x, root );
        }
    
        /**
         * Find the smallest item in the tree.
         * @return smallest item or null if empty.
         */
        public AnyType findMin( )
        {
            if( isEmpty( ) )
                throw new UnderflowException( );
            return findMin( root ).element;
        }
    
        /**
         * Find the largest item in the tree.
         * @return the largest item of null if empty.
         */
        public AnyType findMax( )
        {
            if( isEmpty( ) )
                throw new UnderflowException( );
            return findMax( root ).element;
        }
    
        /**
         * Find an item in the tree.
         * @param x the item to search for.
         * @return true if not found.
         */
        public boolean contains( AnyType x )
        {
            return contains( x, root );
        }
    
        /**
         * Make the tree logically empty.
         */
        public void makeEmpty( )
        {
            root = null;
        }
    
        /**
         * Test if the tree is logically empty.
         * @return true if empty, false otherwise.
         */
        public boolean isEmpty( )
        {
            return root == null;
        }
    
        /**
         * Print the tree contents in sorted order.
         */
        public void printTree( )
        {
            if( isEmpty( ) )
                System.out.println( "Empty tree" );
            else
                printTree( root );
        }
    
        /**
         * Internal method to insert into a subtree.
         * @param x the item to insert.
         * @param t the node that roots the subtree.
         * @return the new root of the subtree.
         */
        private BinaryNode<AnyType> insert( AnyType x, BinaryNode<AnyType> t )
        {
            if( t == null )
                return new BinaryNode<>( x, null, null );
            
            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 nothing
            return t;
        }
    
        /**
         * Internal method to remove from a subtree.
         * @param x the item to remove.
         * @param t the node that roots the subtree.
         * @return the new root of the subtree.
         */
        private BinaryNode<AnyType> remove( AnyType x, BinaryNode<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 children
            {
                t.element = findMin( t.right ).element;
                t.right = remove( t.element, t.right );
            }
            else
                t = ( t.left != null ) ? t.left : t.right;
            return t;
        }
    
        /**
         * Internal method to find the smallest item in a subtree.
         * @param t the node that roots the subtree.
         * @return node containing the smallest item.
         */
        private BinaryNode<AnyType> findMin( BinaryNode<AnyType> t )
        {
            if( t == null )
                return null;
            else if( t.left == null )
                return t;
            return findMin( t.left );
        }
    
        /**
         * Internal method to find the largest item in a subtree.
         * @param t the node that roots the subtree.
         * @return node containing the largest item.
         */
        private BinaryNode<AnyType> findMax( BinaryNode<AnyType> t )
        {
            if( t != null )
                while( t.right != null )
                    t = t.right;
    
            return t;
        }
    
        /**
         * Internal method to find an item in a subtree.
         * @param x is item to search for.
         * @param t the node that roots the subtree.
         * @return node containing the matched item.
         */
        private boolean contains( AnyType x, BinaryNode<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;    // Match
        }
    
        /**
         * Internal method to print a subtree in sorted order.
         * @param t the node that roots the subtree.
         */
        private void printTree( BinaryNode<AnyType> t )
        {
            if( t != null )
            {
                printTree( t.left );
                System.out.println( t.element );
                printTree( t.right );
            }
        }
    
        /**
         * Internal method to compute height of a subtree.
         * @param t the node that roots the subtree.
         */
        private int height( BinaryNode<AnyType> t )
        {
            if( t == null )
                return -1;
            else
                return 1 + Math.max( height( t.left ), height( t.right ) );    
        }
        
        // Basic node stored in unbalanced binary search trees
        private static class BinaryNode<AnyType>
        {
                // Constructors
            BinaryNode( AnyType theElement )
            {
                this( theElement, null, null );
            }
    
            BinaryNode( AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt )
            {
                element  = theElement;
                left     = lt;
                right    = rt;
            }
    
            AnyType element;            // The data in the node
            BinaryNode<AnyType> left;   // Left child
            BinaryNode<AnyType> right;  // Right child
        }
    
    
          /** The tree root. */
        private BinaryNode<AnyType> root;
    
    
            // Test program
        public static void main( String [ ] args )
        {
            BinarySearchTree<Integer> t = new BinarySearchTree<>( );
            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 );
    
            for( int i = 1; i < NUMS; i+= 2 )
                t.remove( i );
    
            if( NUMS < 40 )
                t.printTree( );
            if( t.findMin( ) != 2 || t.findMax( ) != NUMS - 2 )
                System.out.println( "FindMin or FindMax error!" );
    
            for( int i = 2; i < NUMS; i+=2 )
                 if( !t.contains( i ) )
                     System.out.println( "Find error1!" );
    
            for( int i = 1; i < NUMS; i+=2 )
            {
                if( t.contains( i ) )
                    System.out.println( "Find error2!" );
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:[Java]BST树 插入 删除

          本文链接:https://www.haomeiwen.com/subject/kdefaftx.html