实现TreeMap<K,V>树映射类的keySet(),value()等方法
时间: 2024-01-30 12:02:27 浏览: 75
下面是一个基于红黑树实现的TreeMap<K, V>树映射类的示例,包括keySet()和values()方法的实现:
```java
import java.util.*;
public class TreeMap<K extends Comparable<K>, V> {
// 内部节点类
private static class Node<K, V> {
K key;
V value;
Node<K, V> left;
Node<K, V> right;
boolean isRed;
Node(K key, V value) {
this.key = key;
this.value = value;
this.isRed = true;
}
}
private Node<K, V> root;
public void put(K key, V value) {
if (key == null) {
throw new IllegalArgumentException("Key cannot be null");
}
if (value == null) {
throw new IllegalArgumentException("Value cannot be null");
}
root = put(root, key, value);
root.isRed = false;
}
private Node<K, V> put(Node<K, V> node, K key, V value) {
if (node == null) {
return new Node<>(key, value);
}
int cmp = key.compareTo(node.key);
if (cmp < 0) {
node.left = put(node.left, key, value);
} else if (cmp > 0) {
node.right = put(node.right, key, value);
} else {
node.value = value;
}
if (isRed(node.right) && !isRed(node.left)) {
node = rotateLeft(node);
}
if (isRed(node.left) && isRed(node.left.left)) {
node = rotateRight(node);
}
if (isRed(node.left) && isRed(node.right)) {
flipColors(node);
}
return node;
}
private boolean isRed(Node<K, V> node) {
if (node == null) {
return false;
}
return node.isRed;
}
private Node<K, V> rotateLeft(Node<K, V> node) {
Node<K, V> x = node.right;
node.right = x.left;
x.left = node;
x.isRed = node.isRed;
node.isRed = true;
return x;
}
private Node<K, V> rotateRight(Node<K, V> node) {
Node<K, V> x = node.left;
node.left = x.right;
x.right = node;
x.isRed = node.isRed;
node.isRed = true;
return x;
}
private void flipColors(Node<K, V> node) {
node.isRed = true;
node.left.isRed = false;
node.right.isRed = false;
}
public Set<K> keySet() {
Set<K> keys = new HashSet<>();
collectKeys(root, keys);
return keys;
}
private void collectKeys(Node<K, V> node, Set<K> keys) {
if (node == null) {
return;
}
collectKeys(node.left, keys);
keys.add(node.key);
collectKeys(node.right, keys);
}
public Collection<V> values() {
List<V> values = new ArrayList<>();
collectValues(root, values);
return values;
}
private void collectValues(Node<K, V> node, List<V> values) {
if (node == null) {
return;
}
collectValues(node.left, values);
values.add(node.value);
collectValues(node.right, values);
}
}
```
这个示例实现了一个基于红黑树的TreeMap类,包括put()方法用于插入键值对,keySet()方法返回所有键的集合,values()方法返回所有值的集合。
注意,这只是一个简单的示例实现,并没有处理所有可能的情况和异常。在实际使用中,可能需要更多的功能和完善的错误处理。
阅读全文