IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Algorithm第四版算法 C++实现(八)——二叉查找树(BST/二叉搜索树) -> 正文阅读

[C++知识库]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;
	}
};

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:00:48  更:2021-08-04 11:02:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 22:06:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码