算法与数据结构 其五 二叉查找树

来源:互联网 发布:openwrt 网络重启命令 编辑:程序博客网 时间:2024/05/01 22:18

二叉查找树

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。一般根节点比左节点大比右节点小。

最基本实现方式

public class BinarySearchTree<E extends Comparable<? super E>>{    //节点    private static class BinaryNode<E>{        E e;        BinaryNode<E> left;        BinaryNode<E> right;        public BinaryNode(E e){            this(e,null,null);        }        public BinaryNode(E e, BinaryNode<E> left, BinaryNode<E> right) {            this.e = e;            this.left = left;            this.right = right;        }    }    //根节点    private BinaryNode<E> root;    public BinarySearchTree(){        root = null;    }    public void makeEmpty(){        root = null;    }    public boolean isEmpty(){        return root==null;    }     //判断是否存在某个节点    public boolean contains(E e){        return contains(e,root);    }    //判断是否存在某个节点    private boolean contains(E e,BinaryNode<E> node){        if(e==null) return false;        //比较大小        int compareResult = e.compareTo(node.e);        //新节点比根节点小,向左查找        if(compareResult<0){            return contains(e,node.left);        }else if(compareResult>0) {            return contains(e,node.right);        }else{            return true;        }    }    //找最小    public E findMin(){        if(isEmpty())            throw new NullPointerException();        return findMin(root).e;    }    private BinaryNode<E> findMin(BinaryNode<E> node){        //用递归编写        if(node==null){            return null;        }        else if(node.left==null){            return node;        }else {            return findMin(node.left);        }    }    public E findMax(){        if(isEmpty())            throw new NullPointerException();        return findMax(root).e;    }    private BinaryNode<E> findMax(BinaryNode<E> node){        //用非递归编写        //不过两种都是线性递增,所以没有多大区别        if(node==null){            return null;        }        while(node.right!=null)            node =node.right;        return node;    }    public void insert(E e){        root = insert(e,root);    }    private BinaryNode<E> insert(E e,BinaryNode<E> node){        //如果没有根节点,创建新根节点(一般来说不会存在)        if(node==null)            return new BinaryNode<E>(e,null,null);        //比较大小,判断插入位置        int compareResult = e.compareTo(node.e);        if(compareResult<0){            node.left = insert(e,node.left);        }else if(compareResult>0){            node.right = insert(e,node.right);        }        //如果相等,就没有必要插入        else            ;        return node;    }    public void remove(E e){        root = remove(e,root);        return ;    }    private BinaryNode<E> remove(E e,BinaryNode<E> node){        if(node==null)            return node;        int compareRsult = e.compareTo(node.e);        if(compareRsult<0) {            node.left = remove(e,node.left);        }        else if(compareRsult>0){            node.right = remove(e,node.right);         //如果存在两个子节点        }else if(node.left!=null && node.right!=null ){            //找到右节点的最小节点            node.e = findMin(node.right).e;            //用右节点的最小节点去代替被移除的节点            node.right = remove(node.e,node.right);        }        //只有一个子节点        else{            //使其子节点代替该节点            node = (node.left !=null)?node.left:node.right;        }        return node;    }    public void printTree(){        if(isEmpty())            System.out.println("空树");        else            printTree(root);    }    private void printTree(BinaryNode<E> node){        if(node!=null){            //左            printTree(node.left);            //中            System.out.println(node);            //右            printTree(node.right);        }    }}

当然上面的代码时从书上码下来的(逃

阅读全文
0 0