目前使用的是根据key的hashcode来进行排序,并且没有考虑hash碰撞的问题

 package com.zhou.tree;

 import java.util.Comparator;
import java.util.HashMap;
import java.util.Map; /**
* @Description:
* @author: zhoum
* @Date: 2019-05-16
* @Time: 9:44
*/
public class BinarySearchTree<K,V> { private Node root; private class Node{ private K key; private V value; private Node left,right,parent; public Node(K k,V v,Node parent) {
this.key = k;
this.value = v;
this.parent = parent;
}
} public BinarySearchTree() {} public void put(K k,V v){
if( k == null){ return; }
if(root == null){
root = new Node(k,v,null);
return;
}
insert(root,k,v); } private void insert(Node node,K k,V v){
if(k.hashCode() == node.key.hashCode() && k.equals(node.key)){
node.value = v;
}else if(k.hashCode() > node.key.hashCode()){
if(node.right == null){
Node n = new Node(k,v,node);
node.right = n;
}else {
insert(node.right,k,v);
}
}else {
if(node.left == null){
Node n = new Node(k,v,node);
node.left = n;
}else {
insert(node.left,k,v);
}
}
} public V get(K k){
if(root == null || k == null){
return null;
}
return get(root,k).value;
} private Node get(Node node,K k){
if(node == null){
return null;
}else if(node.key.hashCode() == k.hashCode() && node.key.equals(k)){
return node;
}else if(k.hashCode() > node.key.hashCode()){
if(node.right == null){
return null;
}
return get(node.right,k);
}else {
if(node.left == null){
return null;
}
return get(node.left,k);
} }
public boolean delete(K k){
Node node = get(root , k);
if(node == null){
return false;
}
//被删除节点右孩子为空
if(node.right == null){
//根节点
if(node.parent == null){
if(node.left == null){
root = null;
return true;
}
root = node.left;
root.parent = null;
return true;
}
if(node.parent.left != null && node.key.equals(node.parent.left.key)){
if(node.left == null){
node.parent.left = null;
}else {
node.parent.left = node.left;
node.left.parent = node.parent;
} }else if(node.parent.right != null && node.key.equals(node.parent.right.key)){
if(node.left == null){
node.parent.right = null;
}else {
node.parent.right = node.left;
node.left.parent = node.parent;
} }
return true; }
//被删除节点左孩子为空
if(node.left == null){
//如果为根节点
if(node.parent == null){
if(node.right == null){
root = null;
return true;
}
root = node.right;
root.parent = null;
return true;
}
if(node.parent.left.key.equals(node.key) ){
if(node.right == null){
node.parent.left = null;
}else {
node.parent.left = node.right;
node.right.parent = node.parent;
}
}else if(node.parent.right.key.equals(node.key)){
if(node.right == null){
node.parent.right = null;
}else {
node.parent.right = node.right;
node.right.parent = node.parent;
} }
return true;
} //被删除节点有两孩子
Node deleteNode = get(root , k);
Node minNode = get(root , getMin(deleteNode.right));
deleteNode.right.parent = deleteNode.left.parent = minNode;
if(deleteNode.parent == null){
if(minNode.key.equals(deleteNode.right.key)){
minNode.left = deleteNode.left;
root = minNode;
deleteNode.left.parent = minNode;
minNode.parent = null;
}else {
if(minNode.right != null){
minNode.right.parent = minNode.parent;
minNode.parent.left = minNode.right;
}
minNode.right = deleteNode.right;
minNode.left = deleteNode.left;
deleteNode.right.parent = deleteNode.left.parent = minNode;
minNode.parent = null;
root = minNode;
} }else {
if(minNode.key.equals(deleteNode.right.key)){
minNode.left = deleteNode.left;
minNode.parent = deleteNode.parent;
deleteNode.left.parent = minNode;
if(deleteNode.parent.right.key.equals(deleteNode.key)){
deleteNode.parent.right = minNode;
} else {
deleteNode.parent.left = minNode;
}
}else {
minNode.right.parent = minNode.parent;
minNode.parent.left = minNode.right;
minNode.left = deleteNode.left;
minNode.right = deleteNode.right;
deleteNode.left.parent = deleteNode.right.parent = minNode;
minNode.parent = deleteNode.parent;
if(deleteNode.parent.left.key.equals(deleteNode.key)){ deleteNode.parent.left = minNode;
}else {
deleteNode.parent.right = minNode;
}
}
}
return true;
} private K getMin(Node node){
if(node == null){
return null;
}
if(node.left == null){
return node.key;
}
return getMin(node.left);
} @Override
public String toString() {
Map<K,V> map = new HashMap<>();
setString(map,root);
return map.toString();
} private void setString(Map<K,V> map,Node node){
if(node != null){
map.put(node.key,node.value);
}
if(node.left != null){
setString(map,node.left);
}
if(node.right != null){
setString(map,node.right);
}
} }

测试方法

 public class Test {

     public static void main(String[] args) {

         BinarySearchTree<String,String> b  = new BinarySearchTree<>();
b.put("aaa","123");
b.put("abc","85");
b.put("trf","69");
b.put("u","48");
b.put("jf","1");
b.put("dg","36");
b.put("aaa","999");
System.out.println(b.delete("aaa")); System.out.println(b); }
}

在执行delete前  数据的模型为

删除 aaa后

使用java实现二叉查找树的插入,修改和删除方法的更多相关文章

  1. js/java 获取、添加、修改、删除cookie(最全)

      一.cookie介绍 1.cookie的本来面目 HTTP协议本身是无状态的.什么是无状态呢,即服务器无法判断用户身份.Cookie实际上是一小段的文本信息(key-value格式).客户端向服务 ...

  2. Java知识积累3-XML的DOM解析修改和删除方法

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...

  3. Java知识积累-XML的DOM解析修改和删除方法

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...

  4. java操作xm——添加、修改、删除、遍历

    package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...

  5. Zookeeper通过java创建、查看、修改、删除znode

    本章主要介绍zookeeper如何使用,其实通过zkCli.cmd我们是可以执行一些操作的:声明:参考及转自<http://www.blogjava.net/BucketLi/archive/2 ...

  6. Java如何连接SQLServer,并实现查询、修改、删除方法

    场景:A:在UI自动化时,删除数据时候,在界面UI提示“该XX已被使用,无法删除”. 这时候我们有需要做数据初始化的操作,需要把历史数据做删除,来确脚本运行的重复执行,和稳定性质. B: 在做新增操作 ...

  7. Java 添加、读取、修改、删除Word文档属性

    Word文档属性包括常规.摘要.统计.内容.自定义等,其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目,通过设置这些摘要信息或自定义属性可方便对文档的管理.本文中将主要介绍对文档摘要 ...

  8. Easyui datagrid绑定数据,新增,修改,删除方法(一)

    @{ ViewBag.Title = "UsersList"; } <script type="text/javascript"> $(functi ...

  9. 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(四)

    @{ ViewBag.Title = "xxlist"; } <script type="text/javascript" language=" ...

随机推荐

  1. docker容器虚拟化网络

    linux内核支持六种名称空间 1.主机名和域名  ------->  UTS 2.用户  -------->  User 3.文件挂载系统   ------->  mount 4. ...

  2. 搭建vue工程遇到的问题汇总

    1.vue搭建环境- vue init webpack my-project无响应(如下报错) 原因:node 版本过高.v8.1.0 解决拌饭: 降级,终端指令 n v8.0.0; mac用户: s ...

  3. 刷题70. Climbing Stairs

    一.题目说明 题目70. Climbing Stairs,爬台阶(楼梯),一次可以爬1.2个台阶,n层的台阶有几种爬法.难度是Easy! 二.我的解答 类似的题目做过,问题就变得非常简单.首先用递归方 ...

  4. vscode 双击选中用中划线拼接的名称和几个常用的扩展

    左下角点击图标-选择设置,然后搜索editor.wordSeparators,然后去掉中划线-就可以了 `~!@#$%^&*()=+[{]}\|;:'",.<>/? 这样 ...

  5. UIButton按钮的高亮状态颜色

    首先是adjustsImageWhenHighlighted属性的正确使用: UIButton的adjustsImageWhenHighlighted属性是当UIButton设置了背景图片时,并且没有 ...

  6. 最新版的 vscode 怎么配置 Python?

    请进 -- > https://www.zhihu.com/question/322530705/answer/860418884

  7. 用for循环创建对象

    以下代码Demo: public class TestDemo { public static void main(String[] args) { //以创建5个student为例 int coun ...

  8. 后端——框架——容器框架——spring_core——《官网》阅读笔记——初篇

    1.知识体系 spring-core的知识点大概分为以下几个部分 IOC容器 Bean的配置,XML方式和注解方式 Bean的管理,bean的生命周期,bean的作用域等等 与Bean相关联的接口和对 ...

  9. C语言:将字符串中的前导*号全部移到字符串的尾部。

    //规定输入的字符串中只包含字母和*号,fun函数:将字符串中的前导*号全部移到字符串的尾部. #include <stdio.h> void fun( char *a ) { ]; ch ...

  10. C#中equals和==的区别有哪些

    本文导读:C# 中==是用来判断变量的值是否相等,相等返回true,不相等返回false.Equals是用来判断两个对象(除string类型外)是否相等,相等的 条件是:值,地址,引用全相等,因为St ...