美文网首页
二叉排序树java实现

二叉排序树java实现

作者: 检纠错能力 | 来源:发表于2017-12-25 15:43 被阅读0次

    二叉排序树(Binary Sort Tree),又称二叉查找树,二叉搜索树
    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树
    1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结
    2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
    3)左、右子树也分别为二叉排序树;

    代码实现:

    package tree;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 二叉排序树
     * @author SUJiannan
     * 定义:二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 
        (1)若左子树不空,则左子树上所有结点的键值均小于或等于它的根结点的键值; 
        (2)若右子树不空,则右子树上所有结点的键值均大于或等于它的根结点的键值; 
        (3)左、右子树也分别为二叉排序树;
     */
    public class BinarySearchTree {
    
        private Node root; 
        
        // 查找
        public Node get(Value value){
            return get(value,this.root);
        }
        public Node get(Value value, Node node){
            if(value == null) {
                return null;
            }
            int cmp = node.value.compareTo(value);
            if(cmp > 0) {
                return get(value,node.left);
            } else if (cmp < 0) {
                return get(value,node.right);
            } else {
                return node;
            }
        }
        
        
        // 插入
        public boolean insert(Value n){
            boolean bool = insert(this.root,n);
            //this.root = insert2(this.root,n); //方法2
            return bool;
        }
        public boolean insert(Node node, Value val){
            if(this.root== null ) { 
                this.root = new Node(val);
                return true; 
            } else {
                // 小于等于
                if(node.value.compareTo(val) > 0) {
                    // 没有左子树
                    if(node.left == null) {
                        node.left =  new Node(val); 
                        return true;
                    } else {
                        return insert(node.left,val);
                    } 
                } else if(node.value.compareTo(val) < 0){
                    // 没有右子树
                    if(node.right == null) {
                        node.right =  new Node(val); 
                        return true;
                    } else {
                        return insert(node.right,val);
                    } 
                } else {
                    // 重复插入 失败
                    return false;
                }
            }
        }
        
        // 插入方法2
    //  public Node insert2(Node node, Value val){
    //      if(node == null ) { 
    //          node = new Node(val);
    //          return node; 
    //      }
    //      int cmp = val.compareTo(node.value);
    //      if(cmp > 0) {
    //          node.right = insert2(node.right,val);
    //      } else if(cmp < 0) {
    //          node.left = insert2(node.left,val);
    //      } else {
    //          // 重复插入 不作操作
    //      }
    //      return node;
    //  }
        
        // 删除
        public boolean delete(Value n){
            delete(this.root,n);
            return true;
        }
        private Node delete(Node node, Value value) {
            //先查找,后删除
            if(node == null) {
                return null;
            }
            int cmp = value.compareTo(node.value);
            if(cmp > 0) {
                node.right = delete(node.right,value);
            } else if(cmp < 0) {
                node.left = delete(node.left,value);
            } else {
                // 找到value,删除操作
                if(node.left == null && node.right == null) {
                    node = null;
                } else if (node.left != null && node.right == null) {
                    node = node.left;
                } else if (node.left == null && node.right != null) {
                    node = node.right;
                } else {
                    Node nNode = node.left;
                    // 1.找到当前node的左子树的最大值
                    while(nNode.right != null) {
                        nNode = nNode.right;
                    }
                    // 2.替换
                    node.value = nNode.value;
                    // 3.删除左子树最大值的node
                    node.left = delete(node.left, nNode.value);
                }
            }
            return node; 
        }
        @Override
        public String toString() {
            List<Value> list = new ArrayList<Value>();
            printInOrderRe(this.root,list);
            return list.toString();
        }
        // 中序遍历
        private void printInOrderRe(Node node, List list) {
            if(node != null) {
                printInOrderRe(node.left,list);
                list.add(node.value);
                printInOrderRe(node.right,list);
            }
        }
        
        public static void main(String[] args) {
            BinarySearchTree b = new BinarySearchTree();
            b.insert(new Value(1));
            b.insert(new Value(-20));
            b.insert(new Value(18));
            b.insert(new Value(52));
            b.insert(new Value(12));
            b.insert(new Value(-8));
            b.insert(new Value(-11));
            System.out.println(b);
            Node node18 = b.get(new Value(18));
            System.out.println(node18.value);
            Node node1 = b.get(new Value(1));
            System.out.println(node1.value);
            b.delete(new Value(18));
            System.out.println(b);
            b.delete(new Value(1));
            System.out.println(b);
            b.delete(new Value(52));
            System.out.println(b);
            System.out.println(b.root.value);
        }
        public Node getRoot() {
            return root;
        }
        public void setRoot(Node root) {
            this.root = root;
        }
    }
    class Value implements Comparable<Value>{
    
        private int value;
        public Value(int value) {
            this.value = value;
        }
        @Override
        public int compareTo(Value o) {
            return (this.value - o.value);
        }
        @Override
        public String toString() {
            return "" + value;
        }
    }
    
    class Node {
        public Value value;//值
        public Node left, right;
        public Node(Value value, Node left, Node right) {
            super();
            this.value = value;
            this.left = left;
            this.right = right;
        }
        public Node(Value value) {
            this.value = value;
        }
    }
    

    相关文章

      网友评论

          本文标题:二叉排序树java实现

          本文链接:https://www.haomeiwen.com/subject/hivlgxtx.html