版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33054265/article/details/82764110
一颗二叉查找树(BST)是一颗二叉树,每个结点的键都大于其左子树中的任意结点而小于右子树的任意结点,在Java实现中每个结点都含有一个Comparable的键(以及相关联的值)。
二叉查找树类似于快速排序,跟结点就是快速排序的第一个切分元素,左侧的键都比它小,右侧的键都比它大,对于所有子树同样适用,这和快速排序中对子数组的递归排序完全对应。
在由N个随机键构造的二叉树中查找和插入平均所需比较次数为lgN。
Java代码实现:
public class BST<Key extends Comparable<Key>, Value> {
private Node root;
private class Node{
private Key key;
private Value val;
private Node left, right;
private int N;//以该结点为根的子树中的结点总数
public Node(Key key, Value val, int N){
this.key = key;
this.val = val;
this.N = N;
}
}
public int size(){
return size(root);
}
private int size(Node node){
return node == null ? 0 : node.N;
}
public Value get(Key key){
return get(root, key);
}
private Value get(Node node, Key key){
if(node == null)
return null;
if(key.compareTo(node.key) < 0)
return get(node.left, key);
else if(key.compareTo(node.key) > 0)
return get(node.right, key);
else
return node.val;
}
public void put(Key key, Value val){
root = put(root, key, val);//查找key,找到则更新它的值,否则创建一个新结点
}
private Node put(Node node, Key key, Value val){
if(node == null)
return new Node(key, val, 1);
if(key.compareTo(node.key) < 0)
node.left = put(node.left, key, val);
else if(key.compareTo(node.key) > 0)
node.right = put(node.right, key, val);
else
node.val = val;
node.N = size(node.left) + size(node.right) + 1;
return node;
}
}