文章目录
一、定义
搜索树:
- 适合于描述
字典
的树型结构 - 比跳表和散列表有更好、或类似的性能
- 特别对于
顺序访问
或按排名访问
,散列表实现时间性能差,使用搜索树实现会有更好的时间性能
二叉搜索树:
- 可能为空的二叉树
- 一颗非空的二叉搜索树满足特征:
- 每个元素都有一个关键字,且唯一
- 根节点左子树的关键字 小于 根节点的关键字
- 根节点右子树的关键字 大于 根节点的关键字
- 根节点的左右子树也是二叉搜索树
- 即:任何节点左子树的关键字小于该节点的关键字,右子树的关键字大于该节点的关键字
- 二叉搜索树——二叉排序树
有重复值的二叉搜索树:
- 任何节点左子树的关键字
小于等于
该节点的关键字 - 任何节点右子树的关键字
大于等于
该节点的关键字
索引二叉树:
- 二叉搜索树
- 在每个节点添加一个"leftSize",记录该节点左子树的元素个数
- leftSize(x):给出一个元素在x为根的子树中的排名(0起始)
一个元素的名次(Rank)
是它在排序后的队列中的位置(在中序序列中的位置)
l e f t S i z e ( x ) = r a n k ( x ) , 在以 x 为根的子树中的名次 leftSize(x) = rank(x),在以x为根的子树中的名次 leftSize(x)=rank(x),在以x为根的子树中的名次
二、ADT
二叉搜索树 bsTree:
实例:
- 二叉树
- 每个节点有一个数对,数对的一个成员是关键字,另一个成员是数值
- 所有元素的关键字各不相同
- 任何节点左子树的关键字小于该节点的关键字
- 任何节点右子树的关键字大于该节点的关键字
操作:
- find(k):返回
关键字为k
的数对 - insert§:将
数对p
插入到搜索树中 - erase(k):删除
关键字为k
的数对 - ascend():按照关键字的
升序
排列输出所有数对
索引二叉树 IndexedBSTree:
实例:
- 与bsTree相同
- 只是每一个节点有一个LeftSize域
操作:
- find(k):返回关键字为k的数对
- get(index):返回
第index个
数对 - insert§:将数对p插入到搜索树中
- erase(k):删除关键字为k的数对
- delete(index):删除
第index个
数对 - ascend( ):按照关键字的升序排列输出所有数对
三、二叉搜索树的实现
方法:
// 类binarySearchTree 是类linkedBinaryTree的派生类
template <class K,class E>
class binarySearchTree: public linkedBinaryTree <K,E>
{
public:
//返回关键字theKey匹配的数对的指针,若不存在匹配的数对,则返回NULL
pair<const K,E> * find(const K& theKey) const;
//插入一个数对thePair,如果存在关键字相同的数对,则覆盖
void