```java
package ds.impl;
import ds.Queue;
public class BST<K extends Comparable<K>, V> {
private Node root;
private class Node {
private K key;
private V value;
private Node left, right;
private int size;
public Node(K key, V value, int size) {
this.key = key;
this.value = value;
this.size = size;
}
}
public int size() {
return size(root);
}
private int size(Node x) {
return x == null ? 0 : x.size;
}
public V get(K key) {
return get(root, key);
}
private V get(Node x, K key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp < 0) {
return get(x.left, key);
} else if (cmp > 0) {
return get(x.right, key);
} else {
return x.value;
}
}
public void put(K key, V value) {
root = put(root, key, value);
}
private Node put(Node x, K key, V value) {
if (x == null) {
return new Node(key, value, 1);
}
int cmp = key.compareTo(x.key);
if (cmp < 0) {
x.left = put(x.left, key, value);
} else if (cmp > 0) {
x.right = put(x.right, key, value);
} else {
x.value = value;
}
x.size = size(x.left) + size(x.right) + 1;
return x;
}
public K minKey() {
return minKey(root).key;
}
private Node minKey(Node x) {
return x.left == null ? x : minKey(x.left);
}
public K maxKey() {
return maxKey(root).key;
}
private Node maxKey(Node x) {
return x.right == null ? x : maxKey(x.right);
}
public K floorKey(K key) {
Node x = floorKey(root, key);
return x == null ? null : x.key;
}
private Node floorKey(Node x, K key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp == 0) {
return x;
}
if (cmp < 0) {
return floorKey(x, key);
}
Node t = floorKey(x.right, key);
return t != null ? t : x;
}
public K ceilKey(K key) {
Node x = ceilKey(root, key);
return x == null ? null : x.key;
}
private Node ceilKey(Node x, K key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp == 0) {
return x;
}
if (cmp > 0) {
return ceilKey(x, key);
}
Node t = ceilKey(x.left, key);
return t != null ? t : x;
}
public K selectKey(int k) {
return selectKey(root, k).key;
}
private Node selectKey(Node x, int k) {
if (x == null) {
return null;
}
int t = size(x.left);
if (t > k) {
return selectKey(x.left, k);
} else if (t < k) {
return selectKey(x.right, k - t - 1);
} else {
return x;
}
}
public int rankKey(K key) {
return rankKey(root, key);
}
private int rankKey(Node x, K key) {
if (x == null) {
return 0;
}
int cmp = key.compareTo(x.key);
if (cmp < 0) {
return rankKey(x.left, key);
} else if (cmp > 0) {
return 1 + size(x.left) + rankKey(x.right, key);
} else {
return size(x.left);
}
}
public void deleteMin() {
root = deleteMin(root);
}
private Node deleteMin(Node x) {
if (x.left == null) {
return x.right;
}
x.left = deleteMin(x.left);
x.size = size(x.left) + size(x.right) + 1;
return x;
}
public void deleteMax() {
root = deleteMax(root);
}
private Node deleteMax(Node x) {
if (x.right == null) {
return x.left;
}
x.right = deleteMax(x.right);
x.size = size(x.left) + size(x.right) + 1;
return x;
}
public void delete(K key) {
root = delete(root, key);
}
private Node delete(Node x, K key) {
if (x == null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp < 0) {
x.left = delete(x.left, key);
} else if (cmp > 0) {
x.right = delete(x.right, key);
} else {
if (x.right == null) {
return x.left;
}
if (x.left == null) {
return x.right;
}
Node t = x;
x = minKey(t.right);
x.right = deleteMin(t.right);
x.left = t.left;
}
x.size = size(x.left) + size(x.right) + 1;
return x;
}
public Iterable<K> keys() {
return keys(minKey(), maxKey());
}
private Iterable<K> keys(K lowKey, K highKey) {
LinkedQueue<K> queue = new LinkedQueue<>();
keys(root, queue, lowKey, highKey);
return queue;
}
private void keys(Node x, Queue<K> queue, K lowKey, K highKey) {
if (x == null) {
return;
}
int cmpLow = lowKey.compareTo(x.key);
int cmpHigh = highKey.compareTo(x.key);
if (cmpLow < 0) {
keys(x.left, queue, lowKey, highKey);
}
if (cmpLow <= 0 && cmpHigh >= 0) {
queue.enqueue(x.key);
}
if (cmpHigh > 0) {
keys(x.right, queue, lowKey, highKey);
}
}
}
```
- 1 设计接口
- 1.1 容器接口Container
- 1.2 背包接口Bag
- 1.3 栈接口Stack
- 1.4 队列接口Queue
- 1.5 Union-Find算法接口UF
- 2 实现接口
- 2.1 结点类Node
- 2.2 数组迭代器ArrayIterator
- 2.3 链表迭代器ListIterator
- 2.4 背包(Bag)的实现
- 2.4.1 能动态调整数组大小的Bag
- 2.4.2 链式Bag的实现
- 2.5 栈(Stack)的实现
- 2.5.1 能动态调整数组大小的Stack
- 2.5.2 链式Stack的实现
- 2.6 队列(Queue)的实现
- 2.6.1 能动态调整数组大小的Queue
- 2.6.2 链式Queue的实现
- 2.7 Union-Find算法的实现
- 2.7.1 DefaultUF
- 2.7.2 QuickFindUF
- 2.7.3 QuickUnionUF
- 2.7.4 WeightedQuickUnionUF
- 2.8 测试
- 2.8.1 测试Stack
- 2.8.2 测试Union-Find
- 3 排序算法
- 3.1 定义排序工具的类结构
- 3.2 选择排序
- 3.3 插入排序
- 3.4 希尔排序
- 3.5 归并排序
- 3.5.1 归并排序的合并方法
- 3.5.2 自顶向下的归并排序
- 3.5.3 自底向上的归并排序
- 3.6 快速排序
- 3.6.1 常规快速排序
- 3.6.2 排序前先洗牌
- 3.6.3 快速排序的改进方法-小数据量转成插入排序
- 3.6.4 快速排序的改进方法-三向切分
- 3.7 堆排序
- 3.8 最终的排序工具
- 4 搜索
- 4.1 二分搜索(binarySearch)
- 4.2 优先队列(MaxPriorityQueue)
- 4.3 二叉查找树(BST)
- 4.4 红黑二叉查找树(RedBlackBST)
- 4.5 B-树(BTree)
- 5 图
- 5.1 无向图(Graph)
- 5.2 有向图(Digraph)
- 6 贪心
- Dijkstra算法-单元最短路径
- 7 动态规划
- 7.1 最长公共子序列问题
- 7.2 0-1背包问题
- 7.3 加工顺序问题
- 8 搜索法
- 8.1 图的着色问题
- 8.2 深度优先搜索
- 8.3 回溯法
- 8.3.1 回溯法的算法框架
- 8.3.2 子集树
- 8.3.3 排列树
- 8.3.4 满m叉树(组合树)
- 8.4 广度优先搜索
- 8.5 分支限界法
- 9 随机化算法
- 9.1 数值随机化算法
- 9.2 蒙特卡罗算法
- 9.3 拉斯维加斯算法
- 9.4 舍伍德算法
- 10 数论算法
- 10.1 Stein求最大公约数
- 10.2 矩阵求斐波那切数列
- LeetCode刷题笔记