二分搜索树
常见的应用:字典数据结果, 以键值对形成了表。
- 每个节点的键值大于左孩子,小于右孩子。
- 二分搜索树可以不是一颗完全二叉树,堆是一颗完全的二叉树。
代码实现:
public class BST<Key extends Comparable<Key>, Value> {
// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现
private class Node {
private Key key;
private Value value;
private Node left, right;
public Node(Key key, Value value) {
this.key = key;
this.value = value;
left = right = null;
}
}
private Node root; // 根节点
private int count; // 树种的节点个数
// 构造函数, 默认构造一棵空二分搜索树
public BST() {
root = null;
count = 0;
}
// 返回二分搜索树的节点个数
public int size() {
return count;
}
// 返回二分搜索树是否为空
public boolean isEmpty() {
return count == 0;
}
}
插入函数 insert:
- 判断node是否为空,为空则创建并将其返回(判断递归到底的情况)。
- 如不为空则一直判断,当相等直接更新value的值,不相等的话继续递归比较左右孩子的部分。
//向二分搜索树中插入一个新的(key,value)数据对,返回的是根节点
public void insert(Key key, Value value){
root = insert(root, key, value);
}
private Node insert(Node node, Key key, Value value){
if(node == null){
count ++;
return new Node(key, value);
}
if(key.compareTo(node.key) == 0){
node.value = value;
}else if(key.compareTo(node.key) 》 0){
node.left = insert(node.left, key, value);
}else {
node.right = insert(node.right, key, value);
}
return node;
}
查找函数select
- boolean contain(key):查看二分搜索树中是否存在键key
- Value search(key):二叉树中查找key键的值,如果不存在就返回null
//查看二叉树中包含key
public boolean contain(Key key){
return contain(root, key);
}
private boolean contain(Node node, Key key){
if(node == null){
return false;
}
if(key.compareTo(node.key) == 0){
return true;
}else if(key.compareTo(node.key) < 0){
return contain(node.left, key);
}else {
return contain(node.right, key);
}
}
//二叉树中搜索键key对应的值,如果key不存在,则返回null
public Value search(Key key){
return search(root, key);
}
private Value search(Node node, Key key){
//以node为根,,搜索key所对应的value
if(node == null){
return null;
}
if(key.compareTo(node.key) == 0){
return node.value;
}else if(key.compareTo(node.key) > 0){
return search(node.right, key);
}else {
return search(node.left, key);
}
}
实现的二分搜索树中不是平衡二叉树,如果按照顺序插入一组数据,最坏情况的话可能退化成为一个链表,这样的话推广就是红黑树~