目前使用的是根据key的hashcode来进行排序,并且没有考虑hash碰撞的问题
1 package com.zhou.tree; 2 3 import java.util.Comparator; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 /** 8 * @Description: 9 * @author: zhoum 10 * @Date: 2019-05-16 11 * @Time: 9:44 12 */ 13 public class BinarySearchTree<K,V> { 14 15 private Node root; 16 17 private class Node{ 18 19 private K key; 20 21 private V value; 22 23 private Node left,right,parent; 24 25 public Node(K k,V v,Node parent) { 26 this.key = k; 27 this.value = v; 28 this.parent = parent; 29 } 30 } 31 32 public BinarySearchTree() {} 33 34 public void put(K k,V v){ 35 if( k == null){ return; } 36 if(root == null){ 37 root = new Node(k,v,null); 38 return; 39 } 40 insert(root,k,v); 41 42 } 43 44 private void insert(Node node,K k,V v){ 45 if(k.hashCode() == node.key.hashCode() && k.equals(node.key)){ 46 node.value = v; 47 }else if(k.hashCode() > node.key.hashCode()){ 48 if(node.right == null){ 49 Node n = new Node(k,v,node); 50 node.right = n; 51 }else { 52 insert(node.right,k,v); 53 } 54 }else { 55 if(node.left == null){ 56 Node n = new Node(k,v,node); 57 node.left = n; 58 }else { 59 insert(node.left,k,v); 60 } 61 } 62 } 63 64 65 public V get(K k){ 66 if(root == null || k == null){ 67 return null; 68 } 69 return get(root,k).value; 70 } 71 72 private Node get(Node node,K k){ 73 if(node == null){ 74 return null; 75 }else if(node.key.hashCode() == k.hashCode() && node.key.equals(k)){ 76 return node; 77 }else if(k.hashCode() > node.key.hashCode()){ 78 if(node.right == null){ 79 return null; 80 } 81 return get(node.right,k); 82 }else { 83 if(node.left == null){ 84 return null; 85 } 86 return get(node.left,k); 87 } 88 89 } 90 public boolean delete(K k){ 91 Node node = get(root , k); 92 if(node == null){ 93 return false; 94 } 95 //被删除节点右孩子为空 96 if(node.right == null){ 97 //根节点 98 if(node.parent == null){ 99 if(node.left == null){ 100 root = null; 101 return true; 102 } 103 root = node.left; 104 root.parent = null; 105 return true; 106 } 107 if(node.parent.left != null && node.key.equals(node.parent.left.key)){ 108 if(node.left == null){ 109 node.parent.left = null; 110 }else { 111 node.parent.left = node.left; 112 node.left.parent = node.parent; 113 } 114 115 }else if(node.parent.right != null && node.key.equals(node.parent.right.key)){ 116 if(node.left == null){ 117 node.parent.right = null; 118 }else { 119 node.parent.right = node.left; 120 node.left.parent = node.parent; 121 } 122 123 } 124 return true; 125 126 } 127 //被删除节点左孩子为空 128 if(node.left == null){ 129 //如果为根节点 130 if(node.parent == null){ 131 if(node.right == null){ 132 root = null; 133 return true; 134 } 135 root = node.right; 136 root.parent = null; 137 return true; 138 } 139 if(node.parent.left.key.equals(node.key) ){ 140 if(node.right == null){ 141 node.parent.left = null; 142 }else { 143 node.parent.left = node.right; 144 node.right.parent = node.parent; 145 } 146 }else if(node.parent.right.key.equals(node.key)){ 147 if(node.right == null){ 148 node.parent.right = null; 149 }else { 150 node.parent.right = node.right; 151 node.right.parent = node.parent; 152 } 153 154 } 155 return true; 156 } 157 158 //被删除节点有两孩子 159 Node deleteNode = get(root , k); 160 Node minNode = get(root , getMin(deleteNode.right)); 161 deleteNode.right.parent = deleteNode.left.parent = minNode; 162 if(deleteNode.parent == null){ 163 if(minNode.key.equals(deleteNode.right.key)){ 164 minNode.left = deleteNode.left; 165 root = minNode; 166 deleteNode.left.parent = minNode; 167 minNode.parent = null; 168 }else { 169 if(minNode.right != null){ 170 minNode.right.parent = minNode.parent; 171 minNode.parent.left = minNode.right; 172 } 173 minNode.right = deleteNode.right; 174 minNode.left = deleteNode.left; 175 deleteNode.right.parent = deleteNode.left.parent = minNode; 176 minNode.parent = null; 177 root = minNode; 178 } 179 180 }else { 181 if(minNode.key.equals(deleteNode.right.key)){ 182 minNode.left = deleteNode.left; 183 minNode.parent = deleteNode.parent; 184 deleteNode.left.parent = minNode; 185 if(deleteNode.parent.right.key.equals(deleteNode.key)){ 186 deleteNode.parent.right = minNode; 187 } else { 188 deleteNode.parent.left = minNode; 189 } 190 }else { 191 minNode.right.parent = minNode.parent; 192 minNode.parent.left = minNode.right; 193 minNode.left = deleteNode.left; 194 minNode.right = deleteNode.right; 195 deleteNode.left.parent = deleteNode.right.parent = minNode; 196 minNode.parent = deleteNode.parent; 197 if(deleteNode.parent.left.key.equals(deleteNode.key)){ 198 199 deleteNode.parent.left = minNode; 200 }else { 201 deleteNode.parent.right = minNode; 202 } 203 } 204 } 205 return true; 206 } 207 208 private K getMin(Node node){ 209 if(node == null){ 210 return null; 211 } 212 if(node.left == null){ 213 return node.key; 214 } 215 return getMin(node.left); 216 } 217 218 @Override 219 public String toString() { 220 Map<K,V> map = new HashMap<>(); 221 setString(map,root); 222 return map.toString(); 223 } 224 225 private void setString(Map<K,V> map,Node node){ 226 if(node != null){ 227 map.put(node.key,node.value); 228 } 229 if(node.left != null){ 230 setString(map,node.left); 231 } 232 if(node.right != null){ 233 setString(map,node.right); 234 } 235 } 236 237 238 }
测试方法
1 public class Test { 2 3 public static void main(String[] args) { 4 5 BinarySearchTree<String,String> b = new BinarySearchTree<>(); 6 b.put("aaa","123"); 7 b.put("abc","85"); 8 b.put("trf","69"); 9 b.put("u","48"); 10 b.put("jf","1"); 11 b.put("dg","36"); 12 b.put("aaa","999"); 13 System.out.println(b.delete("aaa")); 14 15 System.out.println(b); 16 17 } 18 }
在执行delete前 数据的模型为
删除 aaa后