Task
- 利用BST实现一个城市数据库:每个数据库结点包括城市名称和以整数x与y表示的城市坐标,根据城市名称组织该BST;
- 在该数据库上实现按城市名称进行的插入、删除和检索;
- 打印出以指定字母打头的所有城市记录;
- 打印出与指定点的距离在给定值之内的所有城市记录;
Feature
- 重用性强,BST类未对本项目进行针对性设计。
- Select功能使用函数指针实现命中检测。
- 树支持左旋,右旋操作,平衡通过DSW算法实现。
- DB使用模拟指令进行数据操作,支持"remove",“insert”,“selectKey”,“selectLocation”,“print”,"balance"指令,输入命令为”cmd”时,即进入CIN流读取命令模式
- 尝试使用AA树来实现,但由于自平衡后的树结构发生改变,中序输出时无法通过OJ的判题,于是放弃,在数据库中加入手动平衡指令。
- 数据库类协作图
Code
BST(With balance function)
#ifndef BST_BST_H
#define BST_BST_H
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
template <typename Key, typename E>
class BSTNode
{
private:
Key k;
E it;
BSTNode *lc;
BSTNode *rc;
public:
BSTNode() {
lc = rc = nullptr; }
BSTNode(Key K, E e, BSTNode *l = nullptr, BSTNode *r = nullptr)
{
k = K;
it = e;
lc = l;
rc = r;
}
~BSTNode() = default;
E &element() {
return it; }
void setElement(const E &e) {
it = e; }
Key key() {
return k; }
void setKey(Key K) {
k = K; }
inline BSTNode *left() const {
return lc; }
void setLeft(BSTNode<Key, E> *b) {
lc = (BSTNode *)b; }
inline BSTNode *right() const {
return rc; }
void setRight(BSTNode<Key, E> *b) {
rc = (BSTNode *)b; }
bool isLeaf() {
return (lc == nullptr) && (rc == nullptr); }
};
template <typename Key, typename E>
class BST
{
private:
BSTNode<Key, E> *root;
int nodecount;
void clearhelp(BSTNode<Key, E> *root)
{
if (root == nullptr)
return;
clearhelp(root->left());
clearhelp(root->right());
delete root;
};
BSTNode<Key, E> *inserthelp(BSTNode<Key, E> *root, const Key &k, const E &it)
{
if (root == nullptr)
return new BSTNode<Key, E>(k, it, nullptr, nullptr);
if (k < root->key())
root->setLeft(inserthelp(root->left(), k, it));
else
root->setRight(inserthelp(root->right(), k, it));
return root;
}
BSTNode<Key, E> *getmin(BSTNode<Key, E> *rt)
{
if (rt->left() == nullptr)
return rt;
else
return getmin(rt->left());
}
BSTNode<Key, E> *deletemin(BSTNode<Key, E> *rt)
{
if (rt->left() == nullptr)
return rt->right();
else
{
rt->setLeft(deletemin(rt->left()));