循关键码访问
- call-by-key
- 大小比较,相等比对
词条
template <typename K, typename V> struct Entry{
K key;V value;
Entry(K k=K(), V v=V()):key(k), value(v){};//默认构造函数
Entry(Entry<K, V> const & e): key(e.key), value(e.value){};//克隆
/*还有一些比较的接口*/
bool operator<(Entry<K,V> const& e){ return key<e.key;}//小于
bool operator>(Entry<K,V> const& e){ return key>e.key;}//大于
bool operator==(Entry<K,V> const& e){ return key==e.key;}//等于
bool operator!=(Entry<K,V> const& e){ return key!=e.key;}//不等于
}
二叉搜索树
BST: 节点~ 词条 ~ 关键码
- 顺序性:任意节点均不小于/不大于其左/右后代
- 禁止重复词条
接口
template<typename T> class BST: public BinTree<T> {
public://virtual 修饰,以便派生类重写
virtual BinNodePosi(T) & search(const T &);//查找
virtual BinNodePosi(T) & insert(const T&);//插入
virtual bool remove(const T&);//删除
protected:
BinNodePosi(T) _hot;//命中节点的父亲
BinNodePosi(T) connect34();//3+4重构
BinNodePosi(T) rotateAt(BinNodePosi(T));//旋转调整
}
查找
在这里插入图片描述
- hot的作用
插入算法
删除
RemoveAt() 函数实现:
情况一
只有一个孩子或者没有孩子
if(!HasLChild(*x)) succ=x=x->rChild;//左子树为空
else if(!HasRChild(*x)) succ=x=x->lChild;//右子树为空
else{/*..左右孩子都为空的情况,下面讨论..*/}
情况二
有两个孩子 化繁为简
- 找到直接后继,因为情况二有两个孩子,所以一定是在右孩子的最左侧点
(直接后继没有左孩子,因为是直接后继,应该是最左侧的一个点)