使用java实现二叉查找树的插入,修改和删除方法
目前使用的是根据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实现二叉查找树的插入,修改和删除方法的更多相关文章
- js/java 获取、添加、修改、删除cookie(最全)
一.cookie介绍 1.cookie的本来面目 HTTP协议本身是无状态的.什么是无状态呢,即服务器无法判断用户身份.Cookie实际上是一小段的文本信息(key-value格式).客户端向服务 ...
- Java知识积累3-XML的DOM解析修改和删除方法
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...
- Java知识积累-XML的DOM解析修改和删除方法
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...
- java操作xm——添加、修改、删除、遍历
package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...
- Zookeeper通过java创建、查看、修改、删除znode
本章主要介绍zookeeper如何使用,其实通过zkCli.cmd我们是可以执行一些操作的:声明:参考及转自<http://www.blogjava.net/BucketLi/archive/2 ...
- Java如何连接SQLServer,并实现查询、修改、删除方法
场景:A:在UI自动化时,删除数据时候,在界面UI提示“该XX已被使用,无法删除”. 这时候我们有需要做数据初始化的操作,需要把历史数据做删除,来确脚本运行的重复执行,和稳定性质. B: 在做新增操作 ...
- Java 添加、读取、修改、删除Word文档属性
Word文档属性包括常规.摘要.统计.内容.自定义等,其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目,通过设置这些摘要信息或自定义属性可方便对文档的管理.本文中将主要介绍对文档摘要 ...
- Easyui datagrid绑定数据,新增,修改,删除方法(一)
@{ ViewBag.Title = "UsersList"; } <script type="text/javascript"> $(functi ...
- 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(四)
@{ ViewBag.Title = "xxlist"; } <script type="text/javascript" language=" ...
随机推荐
- linux 配置IPSAN存储
一 SAN存储 1.1 SAN存储介绍 存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通 ...
- JAVA基础学习(7)之函数
7函数 7.1函数定义与调用 7.1.1函数定义 7.1.2函数调用 package com.study.main; public class ObjectStudy { public static ...
- ztree-编辑节点(树节点添加,删除,修改)
<!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - addNodes / editName / rem ...
- 什么是DO / DTO / BO / VO /AO ?
转载:https://blog.csdn.net/ouzhuangzhuang/article/details/86644476 POJO 是 DO / DTO / BO / VO 的统称. DO(D ...
- Laravel Vuejs 实战:开发知乎 (6)发布问题
1.view部分: 安装一个扩展包:Laravel-UEditor composer require "overtrue/laravel-ueditor:~1.0" 配置 添加下面 ...
- 前端框架vue学习笔记:环境搭建
兼容性 不兼容IE8以下 Vue Devtools 能够更好的对界面进行审查和调试 环境搭建 1.nodejs(新版本的集成了npm)[npm是node包管理 node package manager ...
- MYSQL双查询错误1
一.基础知识 开始讲解MYSQL双查询错误之前,我们先了解一下双查询语句以及需要使用到的几个数据库函数和GROUP BY语句 1. 双查询语句 先了解一下什么是子查询,子查询就是嵌入第一层select ...
- mysql成功的远程连接
1.在虚拟机上的window7中安装mysql,版本mysql-5.7.27-win32,可以是解压版或者是安装版的, MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi ...
- python基础(三)---Python基础语法
1. 注释 1.1 单行注释 语法格式: #[空格]说明性文字信息 添加快捷键: Ctrl+/ 取消快捷键: Ctrl+/ 1.2 多行注释 语法格式: """说明性文字 ...
- stl_list复习
#include <iostream>#include <list>#include <algorithm>using namespace std; //底层结构是 ...