zoukankan      html  css  js  c++  java
  • 二分搜索树实现Java的Map(下)

    二分搜索树Map

    public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> {
    
        private class Node
        {
            public K key;
    
            public V value;
    
            public Node left,right;
    
            public Node(K key,V value)
            {
                this.key = key;
                this.value = value;
                left = null;
                right = null;
            }
        }
    
        private Node root;
    
        private int size;
    
        public BSTMap()
        {
            root = null;
            size = 0;
        }
        @Override
        public void add(K key, V value) {
            root = add(root,key,value);
        }
    
        private Node add(Node node,K key,V value)
        {
            if (node == null)
            {
                size ++;
                return new Node(key,value);
            }
            if (key.compareTo(node.key) < 0)
            {
                node.left = add(node.left,key,value);
            }else if(key.compareTo(node.key) > 0)
            {
                node.right = add(node.right,key,value);
            }else {
                node.value = value;
            }
            return node;
        }
    
        @Override
        public V remove(K key) {
            Node node = getNode(root,key);
            if (node != null){
                root = remove(root,key);
                return node.value;
            }
            return null;
        }
    
        private Node remove(Node node,K key)
        {
            if (node == null)
            {
                return null;
            }
            if (key.compareTo(node.key) < 0)
            {
                node.left = remove(node.left,key);
                return node;
            }else if(key.compareTo(node.key) > 0)
            {
                node.right = remove(node.right,key);
                return node;
            }else {
                if (node.left == null)
                {
                    Node rightNode = node.right;
                    node.right = null;
                    size--;
                    return rightNode;
                }
    
                if (node.right == null)
                {
                    Node leftNode = node.left;
                    node.left = null;
                    size--;
                    return leftNode;
                }
    
                Node successor = minimum(node.right);
                successor.right = removeMin(node.right);
                node.left = node.right = null;
                return successor;
            }
        }
    
    
        private Node getNode(Node node,K key)
        {
            if (node == null)
            {
                return null;
            }
            if (key.compareTo(node.key) == 0)
            {
                return node;
            }else if (key.compareTo(node.key) < 0)
            {
                return getNode(node.left,key);
            }else {
                return getNode(node.right,key);
            }
        }
    
        @Override
        public boolean contains(K key) {
            return getNode(root,key) != null;
        }
    
        @Override
        public V get(K key) {
            Node node = getNode(root,key);
            return node == null ? null : node.value;
        }
    
        @Override
        public void set(K key, V newValue) {
            Node node = getNode(root,key);
            if (node == null)
            {
                throw new IllegalArgumentException( key + " is not exist");
            }
            node.value = newValue;
        }
    
        @Override
        public int getSize() {
            return size;
        }
    
        @Override
        public boolean isEmpty() {
            return size == 0;
        }
    
        private Node minimum(Node node)
        {
            if (node.left == null)
            {
                return node;
            }
            return minimum(node.left);
        }
    
        private Node removeMin(Node node)
        {
            if (node.left == null)
            {
                Node rightNode = node.right;
                node.right = null;
                size --;
                return rightNode;
            }
            node.left = removeMin(node.left);
            return node;
        }
    
    
    
    }
    
  • 相关阅读:
    Blackey win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置(转载)
    PyTorch在64位Windows下的Conda包(转载)
    经典的机器学习方面源代码库(非常全,数据挖掘,计算机视觉,模式识别,信息检索相关领域都适用的了)(转载)
    计算机视觉牛人博客和代码汇总(全)(转载)
    计算机视觉开源代码集合(转载)
    中国计算机学会推荐国际学术会议和期刊目录
    C++11 并发指南三(Lock 详解)(转载)
    C++11并发学习之三:线程同步(转载)
    MVC架构模式(转载)
    WPF中动态添加xaml资源文件
  • 原文地址:https://www.cnblogs.com/dslx/p/10498580.html
Copyright © 2011-2022 走看看