二叉搜索树是一种重要的数据结构,也是计算机科学最重要的算法之一。我们用二叉搜索树实现符号表将会使得查找的速率非常的高。因为书中并没有给出API列表,所以我将简单的列一下书中出现的接口
API | 功能 |
---|---|
int size() | 返回树大小 |
V get(T key) | 根据键获取值 |
void put(T key, V value) | 插入一对键-值 |
T min() | 返回最小键 |
T max() | 返回最大键 |
T floor(T key) | 返回下界的键 |
T ceiling(T key) | 返回上界的键 |
T select(int k) | 得到某一位的键 |
int rank(T key) | 得到某键的位 |
std::queue keys(T low,T high) | 范围查找 |
*delete相关的API因为书中并不能很好的实现其功能所以我在此处没有写,感兴趣的读者可以自己查看书中内容并作出相应思考
template<typename T,typename V>
class BST
{
private:
struct node
{
T key;
V value;
node *left;
node *right;
int n;
};
node *root=nullptr;
node* create_node(T key, V value, int n)
{
node *newnode = new node;
newnode->key = key;
newnode->value = value;
newnode->n = n;
newnode->left = nullptr;
newnode->right = nullptr;
return newnode;
}
int size(node *x)
{
if (x == NULL)
return 0;
else
return x->n;
}
V get(node *x, T key)
{
if (x == 0)
return NULL;
if (x->key < key)
{
get(x->right, key);
}
else if (x->key > key)
{
get(x->left, key);
}
else
return x->value;
}
void put(node *x, T key, V value)
{
if (x == NULL)
{
x=create_node(key, value, 1);
return;
}
if (x->key < key)
{
put(x->right, key, value);
}
else if (x->key > key)
{
put(x->left, key, value);
}
else
x->value = value;
x->n = size(x->left) + size(x->right)+1;
return;
}
T min(node *x)
{
if (x->left == nullptr)
return x;
min(x->left);
}
T max(node *x)
{
if (x->right == nullptr)
return x;
max(x->right);
}
node floor(node *x, T key)
{
if (x == NULL)
return NULL;
if (x->key == key)
return x;
if (x->key > key)
return floor(x->left, key);
node t = floor(x->right, key);
if (t!=NULL)
return t;
else
return x;
}
node ceiling(node *x, T key)
{
if(x == NULL)
return NULL;
if (x->key == key)
return x;
if (x->key < key)
return floor(x->right, key);
node t = floor(x->left, key);
if (t != NULL)
return t;
else
return x;
}
node select(node *x, int k)
{
if (x == NULL)
return NULL;
int t = size(x->left);
if (t > k)
return select(x->left, k);
else if (t < k)
return select(x->right, k - t - 1);
else
return x;
}
int rank(node *x, T key)
{
if (x == NULL)
return 0;
if (x->key > key)
{
return rank(x->left, key);
}
else if (x->key < key)
{
return 1 + size(x->left) + rank(x->right, key);
}
else
return size(x->left);
}
void keys(node x, std::queue<T> &q, T low, T high)
{
if (x == NULL)
return;
if (x->key > low)
{
keys(x->left, q, low, high);
}
if (x->key >= low && x->key <= high)
{
q->push(x->key);
}
if (x->key < high)
{
keys(x->right, q, low, high);
}
}
public:
int size() //树的大小
{
return size(root);
}
V get(T key) //获取节点
{
return get(root, key);
}
void put(T key, V value) //插入节点
{
put(root,key,value);
}
T min() //最小值
{
min(root);
}
T max() //最大值
{
max(root);
}
T floor(T key) //下界,向下取整
{
node x = floor(root, key);
if (x == NULL)
return NULL;
return x->key;
}
T ceiling(T key) //上界,向上取整
{
node x = ceiling(root, key);
if (x == NULL)
return NULL;
return x->key;
}
T select(int k) //根据名次找出键
{
node x = select(root, k);
return x->key;
}
int rank(T key) //根据键找出排名
{
return rank(root, key);
}
std::queue<T> keys(T low,T high) //范围查找
{
std::queue<T> q;
keys(root, q, low, high);
return q;
}
};
因为这一节设计比较多的指针,如果有哪个地方有语法错误还请大家指正