zoukankan      html  css  js  c++  java
  • 【数据结构与算法】二叉排序树Java实现

    Java二叉排序树:

        import java.util.ArrayList;
        import java.util.Comparator;
        import java.util.List;
    
        /**
         * 二叉排序树
         * @author wxg
         */
        public  class BST<E>{
            private Node<E> root = null;
            private int size = 0;
            private Comparator<E> compare;
            public BST(Comparator<E> compare){
                this.compare = compare;
            }
            public int size() {
                return size;
            }
    
            public void create(Object[] objects){
                if(objects==null||objects.length<=0)
                    return;
                for(int i=0;i<objects.length;i++){
                    add((E) objects[i]);
                }
            }
    
            public E find(E ele) {
                Node<E> node = root;
                while (node != null) {
                    if (node.value == ele)
                        return ele;
                    node =  compare.compare(node.value,ele) > 0 ? node.left : node.right;
                }
                return null;
            }
    
            public void add(E ele) {
                add(ele,true);
            }
    
            public void add(E ele,boolean isNotRepeat){
                if(ele==null)
                    return;
                Node<E> node = new Node<>();
                node.value = ele;
                if(root==null){
                    root = node;
                }else {
                    if(isNotRepeat){
                        if (find(ele)!=null)
                            return;
                    }
                    Node<E> troot = root;
                    Node<E> tnode = null;
                    while (troot!=null){
                        tnode = troot;
                        troot = compare.compare(tnode.value,ele) > 0 ? tnode.left : tnode.right;
                    }
                    if(compare.compare(tnode.value,ele)>0){
                        tnode.left = node;
                    } else{
                        tnode.right = node;
                    }
                }
                size++;
            }
    
            public void remove(E ele) {
                if (root == null)
                    new NullPointerException();
                Node<E> parent = root;
                Node<E> current = root;
                boolean isLeftChild = false;
                while (current.value != ele) {
                    parent = current;
                    if (compare.compare(current.value,ele) > 0) {
                        isLeftChild = true;
                        current = current.left;
                    } else {
                        isLeftChild = false;
                        current = current.right;
                    }
                    if (current == null) {
                        return;
                    }
                }
                if (current.left == null && current.right == null) {
                    if (current == root) {
                        root = null;
                    }
                    if (isLeftChild) {
                        parent.left = null;
                    } else {
                        parent.right = null;
                    }
                } else if (current.right == null) {
                    if (current == root) {
                        root = current.left;
                    }
                    if (isLeftChild) {
                        parent.left = current.left;
                    } else {
                        parent.right = current.right;
                    }
                } else if (current.left == null) {
                    if (current == root) {
                        root = current.right;
                    }
                    if (isLeftChild) {
                        parent.left = current.left;
                    } else {
                        parent.right = current.right;
                    }
                } else {
                    Node<E> curr = current.right;
                    Node<E> p = curr;
                    while (curr.left != null) {
                        p = curr;
                        curr = curr.left;
                    }
                    if (isLeftChild) {
                        parent.left = curr;
                    } else {
                        parent.right = curr;
                    }
                    curr.left = current.left;
                    curr.right = current.right;
                    p.left = null;
                    p.right = null;
                    current = curr;
                }
                size--;
            }
    
            private static class Node<E>{
                E value;
                Node<E> left;
                Node<E> right;
            }
    
            public E min(){
                return findMinNode(root).value;
            }
    
            public E max(){
                return findMaxNode(root).value;
            }
    
            private Node<E> findMinNode(Node<E> node){
                if(root==null)
                    return null;
                if(node.left==null)
                    return node;
                else return findMinNode(node.left);
            }
    
            private Node<E> findMaxNode(Node<E> node){
                if(root==null)
                    return null;
                if(node.right==null)
                    return node;
                else return findMaxNode(node.right);
            }
    
            public List<E> getAll(){
                List<E> list = new ArrayList<>(this.size);
                each(root,list);
                return list;
            }
            private void each(Node<E> node,List<E> list){
                if(node!=null){
                    list.add(node.value);
                    each(node.left,list);
                    each(node.right,list);
                }
            }
            public boolean contains(E ele){
                E e = find(ele);
                return e==null?false:true;
            }
        }
  • 相关阅读:
    jQuery第1天
    JS基础-第5天
    JS基础-第1天
    移动开发day4_京东移动页面
    关于Python脚本通过crontab调度的时候报错UnicodeEncodeError: ‘ascii’ codec can’t encode characters in positi的解决方案
    关于redshift数据库当中的STL_LOAD_ERRORS问题的解决
    关于对key-value的数据行转化为列的sql操作
    关于mongodb当中的数据导入到mysql数据。
    关于hive当中的窗口分析函数总结
    关于hive当中表的存储和压缩方式总结
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286705.html
Copyright © 2011-2022 走看看