Algorithm第四版算法 C++实现(八)——二叉查找树(BST/二叉搜索树)

二叉搜索树是一种重要的数据结构,也是计算机科学最重要的算法之一。我们用二叉搜索树实现符号表将会使得查找的速率非常的高。因为书中并没有给出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;
	}
};

因为这一节设计比较多的指针,如果有哪个地方有语法错误还请大家指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值