1.二叉树结点
- API设计
public class Node <Key,Value>{
public Node left;
public Node right;
public Key key;
public Value value;
public Node(Node left, Node right, Key key, Value value) {
this.left = left;
this.right = right;
this.key = key;
this.value = value;
}
}
2.二叉查找数 BinaryTree
- API设计
1.查找
//查询树中指定key对应的value
public Value get(Key key) {
return get(root,key);
}
//从指定的树x中,查找key对应的值
public Value get(Node x, Key key){
//如果子树为空
if(x==null){
return null;
}
//如果x树不为空
//比较key和x结点的键的大小
int cmp=key.compareTo(x.key);
if(cmp>0){
//如果key大于x结点的键,则继续找x结点的右子树
get(x.right,key);
}else if(cmp<0){
//如果key小于x结点的键,则继续找x结点的左子树
get(x.left,key);
}else{
//如果key等于x结点的键,就找到了键为key的结点,只需要返回x结点的值即可
return x.value;
}
}
2.添加
//向树中添加元素key-value
public void put(Key key, Value value){
root=put(root,key,value);
}
//向指定的树n中添加key-value,并返回添加元素后新的树
public void put(Node n,Key key,Value value){
//如果子树为空
if (n==null){
N++;
return root=new Node(key,value,null,null);
}
//如果子树不为空
int cmp=key.compareTo(n.key);
if(cmp>0){
//如果key大于n结点的键,则继续找n结点的右子树
n.right=put(n.right,key,value);
}else if(cmp<0){
//如果key小于n结点的键,则继续找n结点的左子树
n.left=put(n.left,key,value);
}else {
n.value=value;
}
return n;
}
3.删除
//删除树中key对应的value
public void delete(Key key) {
delete(root, key);
}
//删除指定树x中的key对应的value,并返回删除后的新树
public Node delete(Node x, Key key) {
//x树为null
if (x==null){
return null;
}
//x树不为null
//找到key所在的结点
//比较key和x结点的键的大小
int cmp=key.compareTo(x.key);
if(cmp>0){
//如果key大于x结点的键,则继续找x结点的右子树
x.right=delete(x.right,key);
}else if(cmp<0){
//如果key小于x结点的键,则继续找x结点的左子树
x.left = delete(x.left,key);
}else{
//如果key等于x结点的键,完成真正的删除结点动作,要删除的结点就是x;
//让元素个数-1
N--;
//找到右子树中最小的结点
if(x.right==null){
return x.left;
}
if (x.left==null){
return x.right;
}
//先将右子树中最小结点用新结点保留
Node minNode=x.right;
while (minNode.left!=null){
minNode=minNode.left;
}
//再删除右子树中最小的结点
Node n=x.right;
while (n.left!=null){
if(n.left.left==null){
n.left=null;
}else {
//变换n结点即可
n=n.left;
}
}
//让x结点的左子树成为minNode的左子树
minNode.left=x.left;
//让x结点的右子树成为minNode的右子树
minNode.right=x.right;
//让x结点的父结点指向minNode
x=minNode;
}
return x;
}