二叉查找树java实现

时间:2021-09-21 16:32:21

主要参考<<数据结构与算法分析>>Java语言描述(Mark Allen Weiss)

二叉查找树主要的操作是:1.查找,2,插入,删除。

查找操作:从根节点开始,递归查找。如果值等于当前根节点,返回根节点存储的值。若果查找的值小于跟根节点的值,则查找左子树,反之递归查找右子树。如果要查找的当前节点为NULL,说明查找结束了,没有找到要查找的元素。

插入操作:基本和查找操作相同,只是最后加入找到的是null,则新建一个节点,并返回。

删除操作:找到要删除的节点,让右子树最左边的节点替代。然后删除此节点右子树最小节点。

代码如下:

public class BinarySearchTree<T extends Comparable<? super T>> {
    
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BinarySearchTree<Integer> bst = new BinarySearchTree<Integer>();
        Integer[] a = {2,45,43,67,8,10,12,43,65,87,432,11,90,48,40};//测试数据
        for(int i = 0;i<a.length;i++){
            bst.insert(a[i]);
        }
        bst.remove(45);
        bst.remove(12);
         bst.showTree();
    }
    
    private BinaryNode<T> root;
    public static class BinaryNode<T>{
        public T element;
        public BinaryNode<T> left;
        public BinaryNode<T> right;
        public BinaryNode(T element, BinaryNode<T> left, BinaryNode<T> right) {
            this.element = element;
            this.left = left;
            this.right = right;
        }
        public BinaryNode(T theElement) {
            element = theElement;
        }    
        
    }
    
    public BinarySearchTree() {
        root = null;
    }

    public BinarySearchTree(BinaryNode<T> root) {
        this.root = root;
    }
    
    
    public boolean isEmpty(){
        return root == null;
    }
    
    public void makeEmpty(){
        root = null;
    }
    
    public boolean contains(T x){
        return contains(root,x);
    }
    private boolean contains(BinaryNode<T> root, T x) {
        if(root==null){
            return false;
        }
        int comparaResult = x.compareTo(root.element);
        if(comparaResult==1){
            return true;
        }
        else if(comparaResult<0){
            return contains(root.left,x);
        }
        else
            return contains(root.right,x);
    }
    public T findMin(){
        if(isEmpty()){
            try {
                throw new Exception();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return findMin(root).element;
    }
    
    public T findMax() throws Exception{
        if(isEmpty()){
            throw new Exception();
        }
        return findMax(root).element;
    }
    private BinaryNode<T> findMin(BinaryNode<T> root) {
        if(root==null){
            return null;
        }
        else if(root.left==null){
            return root;
        }
        return findMin(root.left);
    }
    private BinaryNode<T> findMax(BinaryNode<T> root) {
        if(root==null){
            return null;
        }
        else if(root.right==null){
            return root;
        }
        return findMax(root.right);
    }
    
    public void insert(T x){
        root = insert(x,root);
    }
    public BinaryNode<T> insert(T x,BinaryNode<T> root){
        if(root==null){
            return new BinaryNode<T>(x, null, null);
        }
        int compareResult = x.compareTo(root.element);
        if(compareResult>0){
            root.right = insert(x,root.right);
        }
        else if(compareResult<0){
            root.left = insert(x,root.left);
        }
        else
            ;
        return root;
    }
    public void remove(T a){
        remove(a,root);
    }

    private BinaryNode<T> remove(T x, BinaryNode<T> root2) {
        if(root2==null){
            return null;
        }
        int comparaResult = x.compareTo(root2.element);
        if(comparaResult < 0){
            root2.left = remove(x,root2.left);
        }
        else if(comparaResult > 0){
            root2.right = remove(x,root2.right);
        }
        else if(root2.left!=null&&root2.right!=null){
            root2.element = findMin(root2.right).element;
            root2.right = remove(root2.element,root2.right);
        }
        else{
            if(root2.left!=null){
                root2 = root2.left;
            }
            else{
                root2 = root2.right;
            }
        }
        return root2;
    }
    public void showTree(){
        showTree(root);
    }
    
    public void showTree(BinaryNode<T> T){
        if(T==null){
            return;
        }
        else{
            showTree(T.left);
            System.out.println(T.element);            
            showTree(T.right);
        }
        
    }
}