二叉搜索树(BST树)

一、简介

(1)二叉搜索树,又叫做二叉排序树二叉查找树有序二叉树
是指一棵空树或者具有下列性质的二叉树:

  1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。
  2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。
  3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。
  4. 左右子树都是二叉搜索树。

(2)二叉搜索树中序遍历的结果就是一个升序序列;

(3)空树也是一个二叉搜索树;

既然有以上性质,那么二叉树的查找是相当方便的;当然插入和删除,复杂度也会明显降低。
这里写图片描述

二、代码实现

(1)二叉搜索树的查找

从根结点开始搜索
如果根结点的健值大于要寻找的key,则向根结左点子树寻找;
如果根结点的健值小于要寻找的健值,则向根结点的右子树寻找;
如果相等,则代表找到;
如果一直找到NULL也没有找到,则说明该健值没有在此二叉搜索树里面;

bool _Find(Node* root,const T& x)//查找---非递归
    {
          //1.如果二叉搜索树为空,则返回错
          if (root==NULL)
          {
              return false;
          }
          //2.二叉搜索树不为空
          Node* cur=root;
          while (cur)
          {
              //2.1如果根结点的健值大于要寻找的key,则向根结点左子树寻找;
              if (cur->data>x)
              {
                  cur=cur->left;
              }
              //2.2如果根结点的健值小于要寻找的健值,则向根结点的右子树寻找;
              else if (cur->data<x)
              {
                    cur=cur->right;
              }
              //2.3如果相等,则代表找到;
              else 
              {
                  return true;
              }
          }
          //2.4如果一直找到NULL也没有找到,则说明该健值没有在此二叉搜索树里面;
          return false;

    }

(2)二叉搜索树的插入

首先说明,在二叉搜索树中,不能出现相同key值的两个结点;
二叉搜索树的插入是,先找到合适的空位置,然后进行插入;如果在寻找的过程中,发现了和要插入的值相同的结点;
那么就不用插入了,直接返回;
这里写图片描述

bool _InsertNoR(Node* root,const T& x)//给搜索二叉树插入某个元素--非递归
    {
        //1.如果二叉搜索树为空,则直接插入节点
        if (root==NULL)
        {
            root=new Node(x);
            _root=root;
            return true;
        }
        //2.二叉搜索树不为空
        Node* cur=root;//遍历二叉搜索树
        Node* father=NULL;//记录正确插入位置的父节点;
        //2.1寻找插入的正确位置,在此期间,如果遇到和插入节点相同的结点,则直接返回错误;
        while (cur)
        {
                if (cur->data==x)
             {
                 return false;
             }
                else if (cur->data > x)
             {
                 father=cur;
                 cur=cur->left;
             }
                else
             {
                 father=cur;
                 cur=cur->right;
             }
        }

        //2.2寻找到正确的插入位置,然后进行插入操作;
            cur=new Node(x);//要插入的结点
        //2.2.1如果父节点的值小于插入的值,则插入到父节点的右边
        if ( x> father->data)
        {
            father->right=cur;
        }
        //2.2.2如果父节点的值大于插入的值,则插入到父节点的左边
        else
        {
            father->left=cur;
        }
        return true;
    } 

(3)二叉搜索树的删除
二插搜索树的删除比较麻烦,下面一一分析;
1>如果二叉搜索树为空,返回错;
2>如果要删除的结点没有在二叉搜索树中,则直接返回错误;
3>如果通过查找,发现要删除的结点是叶子节点,没有左右孩子,则直接将该节点删除;
4>如果通过查找发现要删除的结点只有一个孩子;

  • 如果该要删除的结点是父节点的左孩子,就将该孩子连接到父节点的左边;

  • 如果该要删除的结点是父节点的右孩子,就将该孩子连接到父节点的右边;

5>如果通过寻找发现该要删除的结点左右孩子都有;
那么首先:找到该节点的右子树的最小结点(或者也可以找到该节点的左子树的最大节点),该最小结点就是右子树的最左结点;

然后判断:该最小结点是否还有右子树,如果还有右子树,则还要判断改最小结点是其父节点的左孩子还是右孩子,如果是左孩子,则将该最小结点的右子树连接到其父节点的左边;如果是右孩子,则将该最小结点的右子树连接到其父节点的右边;

最后:将游离出来的最小节点和要删除的结点交换值,然后将最小节点释放;

注: 出现该最小结点是其父节点的右孩子的情况只有一种,那就是这个最小结点就是要删除的结点的右子树的根结点;
这里写图片描述

ool _RmoveNoR(Node* root,const T& x)    //二叉搜索树的删除---非递归
    {
        //1.二叉搜索树为空
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值