学弟讲数据结构-图论-树-二叉排序树

一、概念

二叉排序树:Binary Sort Tree(BST),也称二叉查找树

二叉排序树为非空树时有如下特点:

  • 若左子树非空,则左子树上所有结点值均小于其根结点值
  • 若右子树非空,则右子树上所有结点值均大于其根结点值
  • 其左、右子树本身也是一棵二叉排序树
  • 没有键值相等的结点

对该树进行中序遍历(LDR) : 9 11 23 45 58 76

结论 :中序遍历二叉排序树时会得到一个递增的有序序列

二、性质

节点定义

template<class T>
struct BSTNode{
   
    T value;
    BSTNode<T> *leftSon;
    BSTNode<T> *rightSon;
    BSTNode(T value,BSTNode<T> *leftSon,BSTNode<T> *rightSon){
   
        this->value = value;
        this->leftSon = leftSon;
        this->rightSon = rightSon;
    }
};

2.1 查找

  • 二叉树非空时,查找根结点,若值相等则查找成功,
  • 若不相等,当值小于根结点值时,查找左子树;大于根结点值时,查找右子树
  • 查找到叶节点仍未找到,查找失败

查找23 : 因为23<45则查找左子树;因为23>11则查找右子树;23=23则查找成功
查找47 : 因为47<45则查找右子树;因为47<58则查找左子树;左子树为空,则查找失败

//查找
template<class T>
BSTNode<T> *searchBST(BSTNode<T> *root,T value){
   
    //当前节点为空,说明未找到
    if(root == nullptr){
   
        return nullptr;
    }
    if(root->value == value){
   
        return root;
    }
    //查找左子树
    if(root->value > value){
   
        return searchBST(root->lchind,value);
    }
    //查找右子树
    if(root->value < value){
   
        return searchBST(root->rchind,value);
    }
    
}

2.2 插入

  • 若二叉排序树为空,直接插入结点;
  • 若二叉排序树非空,当值小于根结点时,插入左子树;当值大于根结点时,插入右子树;
  • 若等于根结点时不进行插入
  • 新插入的结点总是叶子结点

插入15 : 因为15<45则选择左子树;因为15>11则选择右子树;15<23则选择左子树;左子树为空,则插入

template<class T>
BSTNode<T> *insertBST(BSTNode<T> *root,T value){
   
    //当前节点为空,说明是叶子节点,可以插入
    if(root == nullptr){
   
        root = new BSTNode<T>(value,nullptr,nullptr);
        return root;
    }
    //值小于根结点时,插入根节点的左子树
    if(root->value > value){
   
        root->leftSon = insertBST(root->leftSon,value);
    }
    //值大于根结点时,插入根节点的右子树
    if(root->value < value){
   
        root->rightSon = insertBST(root->rightSon,value);
    }
    return root;
}

2.3 构建

使初始根节点为空,进行插入操作即可

template<class T>
void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值