数据结构:二叉搜索树实现

循关键码访问

  • 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的作用
    hot的意义
插入算法

插入算法的实现

删除在这里插入图片描述
RemoveAt() 函数实现:
情况一

只有一个孩子或者没有孩子

if(!HasLChild(*x)) succ=x=x->rChild;//左子树为空
else if(!HasRChild(*x)) succ=x=x->lChild;//右子树为空
else{/*..左右孩子都为空的情况,下面讨论..*/}

在这里插入图片描述

情况二

有两个孩子 化繁为简

  • 找到直接后继,因为情况二有两个孩子,所以一定是在右孩子的最左侧点
    (直接后继没有左孩子,因为是直接后继,应该是最左侧的一个点)
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值