二分搜索树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;
} }

二分搜索树实现Java的Map(下)的更多相关文章

  1. 【LeetCode题解】530_二分搜索树的最小绝对值差

    目录 [LeetCode题解]530_二分搜索树的最小绝对值差 描述 方法一.中序遍历二分搜索树 思路 Java 代码 Python 代码 [LeetCode题解]530_二分搜索树的最小绝对值差 描 ...

  2. 7 二分搜索树的原理与Java源码实现

    1 折半查找法 了解二叉查找树之前,先来看看折半查找法,也叫二分查找法 在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引. 如下: int[] arr = new in ...

  3. HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)

    Problem Description As the increase of population, the living space for people is becoming smaller a ...

  4. java——二分搜索树 BST(递归、非递归)

    ~ package Date_pacage; import java.util.Stack; import java.util.ArrayList; import java.util.LinkedLi ...

  5. List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set

    List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...

  6. 浅析二分搜索树的数据结构的实现(Java 实现)

    目录 树结构简介 二分搜索树的基础知识 二叉树的基本概念 二分搜索树的基本概念 二分搜索树的基本结构代码实现 二分搜索树的常见基本操作实现 添加操作 添加操作初步实现 添加操作改进 查询操作 遍历操作 ...

  7. Java的二分搜索树

    定义 二分搜索树是二叉树(不包含重复元素). 二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值. 每一棵子树也是二分搜索树. 二叉树搜索树必须要有比较,继承Compara ...

  8. JAVA二分搜索树

    二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...

  9. 【二分搜索树】1、二分查找法的实现 - Binary Search

    简单记录 - bobo老师的玩转算法系列–玩转算法 - 二分搜索树 二叉搜索树 Binary Search Tree 查找问题 Searching Problem 查找问题是计算机中非常重要的基础问题 ...

随机推荐

  1. Java并发编程——BlockingQueue

    简介 BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 阻塞队列是 ...

  2. C++ 进制转换 十进制十六进制八进制二进制相互转换

    思路: 下面我把相互转换的所有类型都写出来了.实际上都是通过十进制中转的,这样比较简单,写出X进制转成十进制和从十进制转成X进制的两份代码直接拷贝就完成了剩余的部分.哦,对,自己封装了一个charTo ...

  3. JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable

    JDK 源码分析(4)-- HashMap/LinkedHashMap/Hashtable HashMap HashMap采用的是哈希算法+链表冲突解决,table的大小永远为2次幂,因为在初始化的时 ...

  4. python数据存储技巧

    1.文本存储 比如我们现在有10篇文章,每篇文章由三部分组成,题目,作者,内容(title,author,content),然后要求这三个部分明确展示出来,并且每篇文章之间用=====分割. 大致思路 ...

  5. Quartz学习-- quartz基本介绍和 Cron表达式

    Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 ​任务日程管理系统 换句话说就是: ​ 一个预先确定的日程时间到达时,负责执行任务的 ...

  6. 4sumii

    problem description: there is four number list named A,B,C,D; now you should out put the num of  tup ...

  7. printf输出格式介绍(转)

    格式代码 A ABC ABCDEFGH %S A ABC ABCDEFGH %5S ####A ##ABC ABCDEFGH %.5S A ABC ABCDE %5.5S ####A ##ABC AB ...

  8. httpd基础配置和虚拟主机的配置方法

    RedHat6.5  httpd实验的大概步骤 #解包 tar zxf httpd-2.2.17.tar.gz -C /usr/src#切换到目录 cd /usr/src/httpd-2.2.17/# ...

  9. JavaScript的数组知识案例之随机点名器

    本次分享JavaScript主要知识点涉及到for循环.if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 执行后效果图: 思路: 1.网页结构搭建: HTML 2.网页布局美化: ...

  10. React入门一

    React.js算是当今主流框架之一了,好多公司项目都是React.直接上图: 所以最近整合一些论坛,今儿咱就说说React, React 是一个用于构建用户界面的 JAVASCRIPT 库. Rea ...