二叉搜索树——概述】定义】相关习题】具体实现】基本操作】

二叉搜索树

1、概述

二叉搜索树(BST)是二叉树的一种特殊形式。

二叉搜索树具有以下性质:每个节点中的值必须大于(或等于)其左侧子树中的任何值,且小于(或等于)其右侧子树中的任何值。

本节将更详细地介绍二叉搜索树的定义,并提供一些与二叉搜索树相关的习题。

完成后,你将:

  1. 理解二叉搜索树的特性
  2. 熟悉二叉搜索树中的基本操作,及其相关算法思想
  3. 尝试用C++实现二叉搜索树
  4. 完成leetcode BST 入门习题
  5. 理解高度平衡二叉树的概念

2、二叉搜索树的定义

二叉搜索树(BST)是二叉树的一种特殊表现形式,它满足一下特性:

  1. 每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。
  2. 每个节点中的值必须小于(或等于)存储在其右子树中的任何值。

下面是一个二叉搜索树的🌰:

img

3、相关入门习题

【1】验证二叉搜索树

在这里插入图片描述

1)解法一:递归

在这里插入图片描述

bool helper(TreeNode* root,long long lower,long long upper){
   
    if(!root)return true;
    if(root -> val <= lower || root -> val >= upper)return false;
    return helper(root->left,lower,root->val)&&helper(root->right,root->val,upper);
}
    bool isValidBST(TreeNode* root) {
   
    return helper(root,LONG_MIN,LONG_MAX);
    }
2) 解法二:中序遍历

对二叉搜索树进行中序遍历将得到递增序列

    long long pre=LONG_MIN;
    bool isValidBST(TreeNode* root) {
   
        if (!root) 
            return true;
        // 访问左子树
        if (!isValidBST(root->left)) return false;
        // 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
        if (root->val <= pre) return false;
        pre = root->val;
        // 访问右子树
        return isValidBST(root->right);
    }

【2】二叉搜索树迭代器

在这里插入图片描述

class BSTIterator {
          //设计题
public:
    queue<TreeNode*>q;
    BSTIterator(TreeNode* root) {
   
    midorder(root);
    }
    void midorder(TreeNode* root){
   
        if(!root)return;
        midorder(root->left);   //中序遍历直接走
        q.push(root);
        midorder(root->right);
    }
    int next() {
   
    int k=q.front()->val;//以队列头部作为迭代器的位置
    q.pop();
    return k;
    }
    bool hasNext() {
   
    return !q.empty();
    }
};

4、二叉搜索树的基本操作

1-搜索操作

根据BST的特性,对于每个节点:

  1. 如果目标值等于节点的值,则返回节点;
  2. 如果目标值小于节点的值,则继续在左子树中搜索;
  3. 如果目标值大于节点的值,则继续在右子树中搜索。

我们一起来看一个例子:我们在上面的二叉搜索树中搜索目标值为 4 的节点。

img

代码示例
    TreeNode* searchBST(TreeNode* root, int val) {
   
             if(!root)return nullptr;
             if(val<root->val)return searchBST(root->left,val);
             else if(val>root->val)return searchBST(root->right,val);
            else return root;
    }

2-插入操作

二叉搜索树中的另一个常见操作是插入一个新节点。有许多不同的方法去插入新节点,这篇文章中,我们只讨论一种使整体操作变化最小的经典方法。 它的主要思想是为目标节点找出合适的叶节点位置,然后将该节点作为叶节点插入。 因此,搜索将成为插入的起始。

与搜索操作类似,对于每个节点,我们将:

  1. 根据节点值与目标节点值的关系,搜索左子树或右子树;
  2. 重复步骤 1 直到到达外部节点;
  3. 根据节点的值与目标节点的值的关系,将新节点添加为其左侧或右侧的子节点。

在这里插入图片描述

与搜索操作相同,我们可以递归或迭代地进行插入。 它的解决方案也与搜索非常相似,你应该可以自己实现,并以相同的方式分析算法的时间复杂度和空间复杂度。

代码示例:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
   
         if (root==nullptr) {
   
            return new TreeNode(val);
        }
        if (val < root->val) {
   
            root->left = insertIntoBST(root->left, val);
        } else {
   
            root->right = insertIntoBST(root->rig
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0<Solving)1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值