数据结构--二叉查找树的java实现

上代码:

package com.itany.erchachazhaoshu;

public class BinarySearchTree<T extends Comparable<? super T>>
{
    //定义二叉查找树的根节点  每一个查找二叉树都有一个自己的root  节点 root外界看不到
    private BinaryNode<T> root;
    public BinarySearchTree()
    {
        root=null;
    }
    //节点类
    private static class BinaryNode<T>
    {
        private T element;
        private BinaryNode<T> left;
        private BinaryNode<T> right;
        public BinaryNode(T element)
        {
            this(element, null, null);
        }
        public BinaryNode(T element,BinaryNode<T> left,BinaryNode<T> right)
        {
            this.element=element;
            this.left=left;
            this.right=right;
        }
    }
    public void makeEmpty()
    {
        root=null;
    }
    public boolean isEmpty()
    {
        return root==null;
    }
    public boolean contains(T t)
    {
        return contains(t,root);
    }
    //外界是不认识节点的  只会返回T 布尔 或者根本无返回值
    public T findMax() throws Exception
    {
        if(isEmpty())
            throw new Exception();
        return findMax(root).element;
    }
    public T findMin() throws Exception
    {
        if(isEmpty())
            throw new Exception();
        return findMin(root).element;
    }
    public void insert(T t)
    {
        root=insert(t,root);
    }
    public void remove(T t)
    {
        root=remove(t,root);
    }
    //此处使用的是尾递归
    private boolean contains(T t,BinaryNode<T> root)
    {
        //必须在一开始就判断是否为null 否则在调用方法或元素时 会产生空指针异常  也是一个基准条件
        if(root==null)
            return false;
        int compareRes=t.compareTo(root.element);
        if(compareRes==0)
            return true;
        else if(compareRes<0)
            return contains(t,root.left);//不会使栈频繁进出 只会覆盖当前栈
        else
            return contains(t,root.right);
    }
    // 方法二 使用循环代替尾递归找出最大 是返回对应的那个节点
    private BinaryNode<T> findMax(BinaryNode<T> root)
    {
        if(root==null)
            return null;
        else
        {
            while(root.right!=null)
            {
                root=root.right  ;
            }
        }
        return root;
    }
    //方法一 使用递归查找 返回最小节点的引用
    private BinaryNode<T> findMin(BinaryNode<T> root)
    {
        //必须在一开始就判断是否为null 否则在调用方法或元素时 会产生空指针异常
        if(root==null)
            return null;
        //基准条件
        else if(root.left==null)
            return root;
        else
            return findMin(root.left);
    }
    //返回一个插入了之后的整个节点 逐级返回
    private BinaryNode<T> insert(T t,BinaryNode<T> root)
    {
        if(root==null)
            return new BinaryNode<T>(t,null,null);
        else
        {
            int com=t.compareTo(root.element);
            if(com==0)
                ;
            else if(com<0)
                //不断更新当前root的left值 并返回root
                root.left=insert(t,root.left);
            else
                root.right=insert(t,root.right);
            return root;
        }
    }
    //删除和增加一样 都要返回修改之后的节点
    private BinaryNode<T> remove(T t,BinaryNode<T> root)
    {
        //没有找到删除的  什么也不做  直接返回该root
        if(root==null)
            return root;
        int com=t.compareTo(root.element);
        if(com<0)
        {
            root.left=remove(t,root.left);
        }
        else if(com>0)
        {
            root.right=remove(t,root.right);
        }
        else
        {
            //有两个儿子的情况
            if(root.left!=null && root.right!=null)
            {
                root.element=findMin(root.right).element;
                root.right=remove(root.element,root.right);//更新删除之后
            }
            else//包括一个儿子都没有的情况 有一个儿子的情况
                return (root.left!=null)?root.left:root.right;

        }
        return root;
    }
}
package com.itany.erchachazhaoshu;

public class Test
{

    public static void main(String[] args)
    {
        BinarySearchTree bt=new BinarySearchTree();
        bt.insert(3);
        bt.insert(13);
        bt.insert(1);
        try
        {
            System.out.println("max:"+bt.findMax());
            System.out.println("max:"+bt.findMin());
            System.out.println(bt.contains(3));
            bt.remove(13);
            System.out.println(bt.contains(13));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

时间: 2024-12-07 10:31:13

数据结构--二叉查找树的java实现的相关文章

数据结构—二叉查找树

查找树是一种数据结构,二叉查找树是按二叉树结构来组织的.可以用链表结构表示,其中每一个结点就是一个对象.结点中包括:key.数据.left.right.p.其中left.right和p分别指向左儿子,右儿子和父结点. 二叉查找树中的关键字总是满足二叉查找树的性质:y是x左子树上的结点,则key[y]≤key[x],如果y是x右子树上的结点,则key[y]≥key[x]. 遍历: 根据二叉查找树的性质,可以用一个递归算法按排列顺序输出树中的所有关键字.这种是中序遍历算法:因为一子树根的关键字在输出

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

Java数据结构-二叉查找树续以及平衡二叉查找树

??前面一篇文章讲到了二叉查找树的实现,其中的插入操作是使用非递归方法实现的,这里再增加一种递归实现插入的操作,Java代码如下,建议增加到前一篇文章对应的FOBinarySearchTree.java中: /** * @TODO 二叉排序树插入元素(递归方法) * @param e 需要插入的元素 * @return true or false */ public boolean insert(E e){ insert(root,e); return true; } /** * @TODO 二

JAVA数据结构--二叉查找树

二叉查找树定义 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值: 任意节点的左.右子树也分别为二叉查找树: 没有键值相等的节点. 二叉查找树相比于其他数据结构的优势在于查找.插入

数据结构之Heap (Java)

Heap简介 Heap译为“堆”,是一种特殊的树形数据结构,它满足所有堆的特性:父节点的值大于等于子节点的值(max heap),或者小于等于子节点的值(min heap).对于max heap 根节点的值为整个树最大值,反之亦然,min heap 根节点的值为整个树最小值.本文采用Java编程语言简单实现min heap. Java Heap 对于大多数应用来说,Java堆 (Java Heap) 是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动

数据结构——二叉查找树

使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值.这意味着,该树所有的元素以某种统一的方式排序. 二叉查找树的声明 二叉查找树是一棵特殊的二叉树,二叉查找树中节点的结构与二叉树种节点的结构相同,关键在于可以在二叉查找树上可以执行的操作以及对其进行操作的算法.二叉查找树的声明如下: #ifndef  _Tree_H struct TreeNode; typedef struct TreeNode *Posit

数据结构-二叉查找树

前序遍历: 后序遍历: 二叉查找树按照二叉树进行组织.二叉查找树关键字的存储方式总是瞒住二叉查找树性质: 设x为二查查找树种一个节点.如果y是x的左子树中的一个节点,那么key[x] >= key[y].如果y是x的右子树的一个节点,那么key[x] <= key[y]. 这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列. 查找某一个存在节点的前驱和后继.某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,前驱就是小于key[x]的关键字中最大的那个节点.查找二叉前

java数据结构之链表(java核心卷Ⅰ读书笔记)

1.链表 数组和ArrayList的一个重大缺陷就是:从中间位置删除一个元素要付出很大的代价,因为在这个元素删除之后,所有的元素都要向前端移动,在中间的某个位置插入一个元素也是这个原因. (小感悟:sun-zheng说了一句,每天在那安静地写代码,才是最轻松的活,不用这跑那跑,不用费太多的口舌,每天吹着空调,外面就是建筑地,别人风吹日赛,真的写代码是一件最轻松的事情) 我们在数据结构这门课中,在链表中添加或者删除某个元素时候,绕来如去的指针可能已经给人留下了极坏的印象,那么Java的集合类库提供