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

二叉查找树及实现

阅读更多
//二叉搜索树
public class BinarySearchTree<T extends Comparable<? super T>>
{
    /**
     * 构造一棵空树.
     */
    public BinarySearchTree( )
    {
        root = null;
    }

    /**
     * 在二叉搜索树中插入数据.
     * @param x the item to insert.
     */
    public void insert( T x )
    {
        root = insert( x, root );
    }

    /**
     * 从二叉搜索中删除数据(节点).
     * @param x the item to remove.
     */
    public void remove( T x )
    {
        root = remove( x, root );
    }

    /**
     * 找最小数据.
     * @return smallest item or null if empty.
     */
    public T findMin( )
    {
        if( isEmpty( ) )
            throw new UnderflowException( );
        return findMin( root ).element;
    }

    /**
     * 找最大数据.
     * @return the largest item of null if empty.
     */
    public T findMax( )
    {
        if( isEmpty( ) )
            throw new UnderflowException( );
        return findMax( root ).element;
    }

    //二叉搜索树中是否包含x
    public boolean contains( T x )
    {
        return contains( x, root );
    }

   
    public void makeEmpty( )
    {
        root = null;
    }

   
    public boolean isEmpty( )
    {
        return root == null;
    }

   //中序遍历输出二叉搜索树的内容
    public void printTree( )
    {
        if( isEmpty( ) )
            System.out.println( "Empty tree" );
        else
            printTree( root );
    }

    //插入
    private BinaryNode<T> insert( T x, BinaryNode<T> t )
    {
        if( t == null )
            return new BinaryNode<T>( 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;
    }

删除节点是最难的操作了。如果节点是一片树叶,那么它可以立即删除,将原来指向这个节点的引用设为null。如果节点有一个儿子,则该节点可以在其父节点调整自己的链以绕过该节点后被删除。

    //删除
    private BinaryNode<T> remove( T x, BinaryNode<T> t )
    {
         //先在树中查找x   
        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 );
        //在树中找到了节点值为x的节点
        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 BinaryNode<T> findMin( BinaryNode<T> t )
    {
        if( t == null )
            return null;
        else if( t.left == null )
            return t;
        return findMin( t.left );
    }

    //在二叉搜索树中找最大值节点
    private BinaryNode<T> findMax( BinaryNode<T> t )
    {
        if( t != null )
            while( t.right != null )
                t = t.right;

        return t;
    }

   //是否包含
    private boolean contains( T x, BinaryNode<T> 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
    }

   //中序遍历二叉树
    private void printTree( BinaryNode<T> t )
    {
        if( t != null )
        {
            printTree( t.left );
            System.out.print(t.element+"  ");
            printTree( t.right );
        }
       
    }

    // 二叉搜索树节点类
    private static class BinaryNode<T>
    {
            // Constructors
        BinaryNode( T theElement )
        {
            this( theElement, null, null );
        }

        BinaryNode( T theElement, BinaryNode<T> lt, BinaryNode<T> rt )
        {
            element  = theElement;
            left     = lt;
            right    = rt;
        }

        T element;            // The data in the node
        BinaryNode<T> left;   // Left child
        BinaryNode<T> right;  // Right child
    }


      /** 二叉搜索树的根 */
    private BinaryNode<T> root;


        // 测试
    public static void main( String [ ] args )
    {
        BinarySearchTree<Integer> t = new BinarySearchTree<Integer>( );
        final int NUMS = 100;
        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 );
         t.printTree( );
       System.out.printf("\n\n");
       
       for( int i = 1; i < NUMS; i+= 2 )
            t.remove( i );
           t.printTree( );
        System.out.println();
       
        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!" );
        }
    }
}



下载源码:
  • 大小: 40.6 KB
  • ex.zip (1.8 KB)
  • 下载次数: 4
分享到:
评论

相关推荐

    二叉查找树C++实现

    在C++中实现二叉查找树,我们需要定义一个结构体或类来表示树节点,包括节点的值、指向左子节点和右子节点的指针。以下是一个简单的C++实现框架: ```cpp struct TreeNode { int val; TreeNode* left; TreeNode*...

    C++模板类二叉查找树的实现

    `TreeH.h`很可能是头文件,包含了二叉查找树模板类的定义,而`TreeD.cpp`则可能包含了该类的实现以及相关的测试用例。 在`TreeH.h`中,我们可能会看到一个名为`BinarySearchTree`的模板类,它的模板参数可以是任何...

    二叉查找树实现简单的信息检索

    在"二叉查找树实现简单的信息检索"中,我们关注的是如何利用二叉查找树来高效地检索信息。首先,我们需要创建一个二叉查找树的数据结构。在提供的文件中,`Binary_tree.h`和`Binary_tree.cpp`很可能是定义和实现这个...

    二叉查找树的实现

    1、 定义二叉查找树的类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)实现二叉查找树结构; 2) 实现二叉查找树的查找、插入和删除等算法;

    二叉查找树 减治法——C++代码

    在C++中实现二叉查找树,一般会定义一个结构体或类来表示树节点,包括键、值和子节点指针。然后,提供一系列成员函数来执行基本操作,如`insert`(插入)、`search`(查找)、`delete`(删除)。以下是C++实现二叉...

    二叉查找树练习

    实现`findwords`函数时,首先需要将文件中的单词提取出来,并且用二叉查找树进行存储。在C语言中,我们可以创建一个结构体来表示树节点,包括单词(key)和指向左右子节点的指针。初始化树时,可以创建一个空节点...

    C++二叉查找树的实现

    通过上述代码解析,我们了解了二叉查找树的基本概念、插入及遍历操作的具体实现过程。这种数据结构因其高效的操作性能,在实际应用中非常常见。理解二叉查找树的原理对于掌握更高级的数据结构如AVL树、红黑树等也是...

    C++实现的最优二叉查找树

    用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用

    二叉查找树c 源码

    在C语言中实现二叉查找树,我们需要定义一个结构体来表示树的节点,通常包括键、值以及指向左右子节点的指针。下面是一个简单的二叉查找树节点结构体定义: ```c typedef struct TreeNode { int key; void* value...

    最优二叉查找树

    标题:最优二叉查找树 描述:算法对最优二叉树的实现(课本上对最优二叉树的基本实现) 在计算机科学中,最优二叉查找树(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉查找树,其设计目标是在平均情况...

    二叉查找排序树的实现代码

    最近在研究数据结构这本书,自己动手实现的一个二叉查找排序树的类BinSortTree,实现数据的插入,查找,删除,层序遍历,中序遍历等操作,熟悉数据结构的朋友都知道,根据二叉排序树的定义,中序遍历后得到的序列...

    简单二叉查找树的java实现

    二叉查找树的实现。包括树的平衡以及树节点的删除。以及树的广度优先遍历,深度优先遍历。

    二叉查找树的C语言实现——插入,删除,查找

    在C语言中实现二叉查找树,我们需要定义一个结构体来表示树节点,包含节点的值以及指向左右子节点的指针。例如: ```c typedef struct Node { int data; struct Node* left; struct Node* right; } Node; ``` ...

    二叉查找树(二叉排序树)的详细实现

    这是一个二叉查找树,实现了以下操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继。上述所有操作时间复杂度均为o(h),其中h是树的高度 注释很详细,具体内容就看...

    二叉查找树的C++实现

    ### 二叉查找树的C++实现 #### 一、二叉查找树简介 二叉查找树(Binary Search Tree),也称作有序或排序二叉树,是一种特殊的二叉树数据结构,其每个节点包含一个键(key)和两个指针(指向左子树和右子树)。对于...

    二叉查找树完整C++代码

    C++实现二叉查找树时,通常会定义一个结构体或类来表示树的节点,包括键值、左右子节点的指针。例如: ```cpp struct TreeNode { int key; TreeNode* left; TreeNode* right; }; ``` 在C++中,二叉查找树的基本...

    最优二叉查找树 动态规划法.cpp.rar

    总之,这个C++课程作业通过动态规划法实现了最优二叉查找树的构建,旨在提高搜索效率。通过分析和理解代码,你可以深入学习动态规划的应用以及二叉查找树的优化策略。对于学习数据结构和算法的学生来说,这是一个很...

Global site tag (gtag.js) - Google Analytics