二分搜索树实现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;
} }
二分搜索树实现Java的Map(下)的更多相关文章
- 【LeetCode题解】530_二分搜索树的最小绝对值差
目录 [LeetCode题解]530_二分搜索树的最小绝对值差 描述 方法一.中序遍历二分搜索树 思路 Java 代码 Python 代码 [LeetCode题解]530_二分搜索树的最小绝对值差 描 ...
- 7 二分搜索树的原理与Java源码实现
1 折半查找法 了解二叉查找树之前,先来看看折半查找法,也叫二分查找法 在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引. 如下: int[] arr = new in ...
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
Problem Description As the increase of population, the living space for people is becoming smaller a ...
- java——二分搜索树 BST(递归、非递归)
~ package Date_pacage; import java.util.Stack; import java.util.ArrayList; import java.util.LinkedLi ...
- List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
- 浅析二分搜索树的数据结构的实现(Java 实现)
目录 树结构简介 二分搜索树的基础知识 二叉树的基本概念 二分搜索树的基本概念 二分搜索树的基本结构代码实现 二分搜索树的常见基本操作实现 添加操作 添加操作初步实现 添加操作改进 查询操作 遍历操作 ...
- Java的二分搜索树
定义 二分搜索树是二叉树(不包含重复元素). 二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值. 每一棵子树也是二分搜索树. 二叉树搜索树必须要有比较,继承Compara ...
- JAVA二分搜索树
二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...
- 【二分搜索树】1、二分查找法的实现 - Binary Search
简单记录 - bobo老师的玩转算法系列–玩转算法 - 二分搜索树 二叉搜索树 Binary Search Tree 查找问题 Searching Problem 查找问题是计算机中非常重要的基础问题 ...
随机推荐
- 人脸姿态校正算法 附完整C++示例代码
在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...
- 分布式任务调度平台XXL-JOB
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
- Java中浮点数的精度问题 【转】
当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...
- HTML DOM innerHTML 属性及实现图片连续播放
定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. 语法 tablerowObject.innerHTML=HTML 实例 下面的例子返回了表格行的 inner H ...
- 学习AD、DA的体会
AD转换器的转换是指模拟信号输入转化为数字信号输出,而DA转换器是把数字信号转换为模拟信号,在ADC0832.TLC549和TLC5615程序设计中,通过使用中断服务函数每0.5s对ADC0832进行 ...
- github routine
1. 从官方库fork 自己的分支库后,git clone到local. 2. local的remotes/origin默认是自己的分支库.可以添加remotes/upstream指向官方库. 3. ...
- File文件的读写操作RandomAccessFile类
1.Java提供了一个对文件随机访问的操作,访问包括读和写操作,该类名是RandomAccessFile,该类的读写是基于指针的操作. 2.RandomAccessFile在堆文件进行随机访问操作时有 ...
- 如何提高缓存命中率(Redis)
缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...
- Spring BeanWrapper分析
最近在读DispatcherServlet 源代码,看到父级类org.springframework.web.servlet.HttpServletBean中关于BeanWrapper的一段代码, 继 ...
- 计算器源码(数学式python)
''' ******************** 请计算表达式: 1 - 2 * ( (60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...