代码如下
public class BinaryTree<Key extends Comparable<Key>, Value> {
private class TreeNode {
//存储键
private Key key;
//存储值
private Value value;
//记录左子结点
private TreeNode left;
//记录右子结点
private TreeNode right;
public TreeNode(Key key, Value value, TreeNode left, TreeNode right) {
this.key = key;
this.value = value;
this.left = left;
this.right = right;
}
}
//创建根结点
private TreeNode root;
//记录树中元素数量
private int sum;
//获取树中的元素个数
public int size() {
return this.sum;
}
//判断树是否为空树
public boolean isEmpty() {
return root == null;
}
//向指定的树中添加key-value,并返回添加后的新的树
private TreeNode put(TreeNode x, Key key, Value value) {
//如果x子树为空
if (x == null) {
sum++;
return new TreeNode(key, value, null, null);
}
//如果x子树不为空
//比较x结点的键和key的大小
int temp = key.compareTo(x.key);
//如果x结点的键小于key,则继续寻找x结点的左子结点
if (temp < 0)
x.right = put(x.right, key, value);
//如果x结点的键大于key,则继续寻找x结点的右子结点
else if (temp > 0)
x.left = put(x.left, key, value);
//如果x结点的键等于key,则替换x结点中的value值
else
x.value = value;
return x;
}
//通过键值对(key-vaule)向树中添加元素
public void put(Key key, Value value) {
root = put(root, key, value);
}
//查询树中指定键值key处对应的value值
public Value get(Key key) {
return get(root, key);
}
//从指定的树中查找key对应的值
public Value get(TreeNode x, Key key) {
//如果该树为空
if (x == null)
return null;
//该树不为空
//比较x结点的键和key的大小
int temp = key.compareTo(x.key);
//若x.key < key,则寻找x结点的右子树
if (temp < 0)
return get(x.right, key);
//若x.key > key,则寻找x结点的左子树
else if (temp > 0)
return get(x.left, key);
//若x.key = key,则返回当前x结点对应的value
else
return x.value;
}
//删除指定x树中key对应的value值,并返回被删除的value值
public TreeNode delete(TreeNode x, Key key) {
//若x树为空树
if (x == null)
return null;
//若x树不为空树
//比较x结点的键和key的大小
int temp = key.compareTo(x.key);
//若x.key < key,则寻找x结点的右子树
if (temp < 0)
x.right = delete(x.right, key);
//若x.key > key,则寻找x结点的左子树
else if (temp > 0)
x.left = delete(x.left, key);
//若x.key = key,则需完成删除x结点的动作
else {
sum--;
//当x的左右子树分别为空的情况下
if (x.right == null)
return x.left;
if (x.left == null)
return x.right;
//若x的左右子树均不为空需要找到x树对应右子树中的最小结点,即寻找到x的右子树的最左边的叶子结点
else {
sum--;
//创建rLeaf为x的右子树的最左边的叶子结点
TreeNode rLeaf = x.right;
while (rLeaf.left != null)
rLeaf = rLeaf.left;
//删除x的最左边的叶子结点
TreeNode Temp = x.right;
while (Temp.left != null) {
if (Temp.left.left == null)
Temp.left = null;
else
Temp = Temp.left;
}
//让rLeaf成为x的左、右子树的双亲
rLeaf.left = x.left;
rLeaf.right = x.right;
//让x结点的父亲成为rLeaf的父亲
x = rLeaf;
}
}
return x;
}
//删除整个树中指定键值key处的value值
public TreeNode delete(Key key){
return delete(root,key);
}
}