二分搜索树首先是一个二叉树,什么是二叉树,二叉树是这个树的节点最多有两个
二分搜索树的根节点大于左节点而小于右节点,而每一个节点所产生的子树也是一个二分搜索树
由此可以推断最小值一定在左子树中,最大值一定在右子树中。
由此可以用递归算法来实现插入和遍历二分搜索树。
插入新数据
//向二分搜索树中添加新元素e
public void add(E e) {
root = add(root, e)
}
//向以node为根的二分搜索树中插入元素E,递归算法
//返回插入新节点之后的二分搜索树的根
private Node add(Node node, E e) {
if (node == null) {
size++;
return new Node(e);
}
if (e.compareTo(node.e) < 0) {
node.left = add(node.left, e);
} else if (e.compareTo(node.e) > 0) {
node.right = add(node.right, e);
}
return node;
}
查询数据
//查看二叉搜索树中是否包含元素e
public boolean contains(E e) {
return contains(root, e);
}
//看以node为根的二分搜索树中是否包含元素e,递归算法
private boolean contains(Node node, E e) {
if (node == null) {
return false;
}
if (e.compareTo(node.e) == 0) {
return true;
} else if (e.compareTo(node.e) < 0) {
return contains(node.left, e);
}else {
return contains(node.right,e);
}
}
删除最大值或者最小值
//删除最小值所在节点,返回最小值
public E removemin() {
E rey = mininum();
removemin(root);
return rey;
}
//删除掉以node为根的二分搜索树中的最小节点
//返回删除及诶单后新的二分搜索树的根
private Node removemin(Node node) {
if(node.left==null) {
Node rnode = node.right;
node.right = null;
size--;
return rnode;
}
node.left = removemin(node.left);
return node;
}
public E removemax() {
E rey = maxnum();
removemax(root);
return rey;
}
private Node removemax(Node node) {
if(node.right==null) {
Node lnode = node.left;
node.left = null;
size--;
return node;
}
node.right = removemax(node.right);
return node;
}
删除任意值
//删除元素为e的节点
public void remove(E e) {
root = remove(root,e);
}
private Node remove(Node node,E e) {
if(node==null) {
return null;
}
if(e.compareTo(node.e)<0) {
node.left = remove(node.left,e);
return node;
}
else if(e.compareTo(node.e)>0) {
node.right = remove(node.right,e);
return node;
}
else {//e==node.e
if(node.left==null) {//待删除节点左子树为空
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}
if(node.right==null) {//待删除节点右子树为空
Node leftNode = node.left;
node.left=null;
size--;
return leftNode;
}
//左右子树都不为null
//找到比待删除节点大的最小节点,即待删除节点右子树的最小节点,用这个节点顶替待删除节点的位置
Node successor = mininum(node.right);//右子树中的最小节点
successor.right = removemin(node.right);
successor.left = node.left;
node.left = node.right = null;
return successor;
}
}