二叉查找树及C++模板实现

何为二叉查找树?

二叉查找树也称为二叉搜索树或二叉排序树。二叉排序树的节点包含键值key。二叉排序树或者是一棵空树,否则要求:

1.若它的左子树不为空,那么左子树上所有节点的key都小于根节点的key
2.若它的右子树不为空,那么右子树上所有节点的key都大于根节点的key
3.它的左右子树也分别为二叉排序树

从定义得,二叉查找树中没有重复key值的节点。

二叉查找树的构建

节点结构
template <typename T>
struct BSNode
{
    //初始化 只赋予权值
    BSNode(T t):value(t),lchild(NULL),rchild(NULL) {}
    //BSNode() = default;

    T value;            //节点的值
    BSNode<T>* lchild;  //左孩子
    BSNode<T>* rchild;  //右孩子
    BSNode<T>* parent;  //节点的双亲
};
二叉查找树的抽象数据结构
template <typename T>
class BSTree
{
public:
    //初始化为空树
    BSTree():root(NULL){}
//外部接口
    void preOrder();    //前序遍历 
    void inOrder();     //中序遍历
    void postOrder();   //后序遍历

    BSNode<T>* search_recursion(T key); //递归查找指定节点
    BSNode<T>* search__iterator(T key); //迭代查找指定节点

    T search_maxnum();      //查找最大元素
    T search_minnum();      //查找最小元素

    void insert(T key);     //插入指定结点
    void remove(T key);     //删除指定结点
    void destory();         //销毁二叉树
    void print();           //打印二叉树

private:
    BSNode<T>* root;        //根节点
//内部接口
    void preOrder(BSNode<T>* pnode);  
    void inOrder(BSNode<T>* pnode);
    void postOrder(BSNode<T>* pnode);

    BSNode<T>* search(BSNode<T>* & p,T key);

    void remove(BSNode<T>* pnode,T key);

    T search_maxnum(BSNode<T>* pnode);      
    T search_minnum(BSNode<T>* pnode);      

    void destory(BSNode<T>* &pnode);

};

具体实现

1. 插入节点

假设我们要为数组 a[] = {10 , 5 , 15 , 6 , 4 , 16 }构建一个二叉查找树,我们按顺序逐个插入元素。

这里写图片描述

插入过程:

  1. 如果是空树,则创建一个新节点,新节点作为根,因此以元素10构建的节点为该二叉查找树的根。
  2. 插入5,5比10小,与10的左孩子节点进行比较,10的左孩子节点为空,进行插入。
  3. 插入15,15比10大,与10的右孩子节点进行比较,10的右孩子节点为空,进行插入。
  4. 插入6,
  • 16
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值