二叉搜索树:原理与应用

简介: 二叉搜索树:原理与应用

二叉搜索树是一种基于有序性的智能数据结构,它在查找、插入和删除等操作中具有出色的性能表现。二叉搜索树的核心思想是利用节点之间的大小关系,通过递归地划分问题范围,从而实现高效的数据操作。在日常生活中,我们经常需要对数据进行存储和管理。以电话簿为例,如果想要查找某个人的电话号码,我们通常会将目光从上往下浏览,逐渐缩小范围,直到找到目标。在计算机领域,二叉搜索树就是一种模仿这种有序查找思想的数据结构。

红黑树主体

结构特点

二叉搜索树的每个节点都包含一个键值,同时满足以下有序性质:

  1. 左子树中的所有节点的键值小于该节点的键值。
  2. 右子树中的所有节点的键值大于该节点的键值。

这个性质使得我们可以快速地进行查找操作,类似于“二分查找”的思想。

这里是一个简单的二叉搜索树:

        7

      /   \

    3      10

   / \       \

  1   5      12

       \

        6

在这个例子中,根节点是7,它的左子树中的节点值都小于7,右子树中的节点值都大于7。每个子树也符合这个规律,这是二叉搜索树的一个重要性质。

查找操作

查找操作是二叉搜索树的一个重要应用。为了查找一个特定的键值,我们可以从根节点开始,不断地根据大小关系向左或向右移动。这里的字符说明了查找键值6的过程:

        7

      /   \

 -> 3      10

   / \       \

  1   5      12

       \

        6

在每一步中,我们比较当前节点的键值。由于6小于7,我们向左移动到节点5。然后,由于6大于5,我们继续向右移动到节点6,最终找到了目标值6。

插入操作

插入操作也是二叉搜索树的重要操作之一。当我们需要插入一个新的键值时,我们从根节点开始查找插入位置。一旦找到合适的位置,我们在那里插入新节点。这里展示了插入键值8的过程:

        7

      /   \

    3      10

   / \       \

  1   5      12

       \

        6

在这个示例中,我们插入了键值8。我们从根节点7开始,由于8大于7,我们向右移动到节点10。然后,由于8小于10,我们向左移动到节点12的位置,最终在这里插入新节点8。

删除操作

删除操作相对复杂,需要考虑多种情况。大致步骤是找到目标节点,然后根据其子节点情况进行处理。如果目标节点没有子节点,可以直接删除;如果只有一个子节点,可以将该子节点替代目标节点;如果有两个子节点,可以找到右子树中的最小节点替代目标节点,并递归删除最小节点。这些步骤保持了二叉搜索树的有序性。

这里笔者写了一个简单的关于插入删除的代码

#include <iostream>
class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
};
class BST {
private:
    TreeNode* root;
public:
    BST() : root(nullptr) {}
    // 插入操作
    TreeNode* insert(TreeNode* node, int val) {
        if (node == nullptr) {
            return new TreeNode(val);
        }
        if (val < node->val) {
            node->left = insert(node->left, val);
        } else if (val > node->val) {
            node->right = insert(node->right, val);
        }
        return node;
    }
    void insert(int val) {
        root = insert(root, val);
    }
    // 查找操作
    bool search(TreeNode* node, int val) {
        if (node == nullptr) {
            return false;
        }
        if (val == node->val) {
            return true;
        } else if (val < node->val) {
            return search(node->left, val);
        } else {
            return search(node->right, val);
        }
    }
    bool search(int val) {
        return search(root, val);
    }
};
int main() {
    BST bst;
    bst.insert(5);
    bst.insert(3);
    bst.insert(7);
    bst.insert(1);
    std::cout << "Search 3: " << (bst.search(3) ? "Found" : "Not Found") << std::endl; // Output: Found
    std::cout << "Search 6: " << (bst.search(6) ? "Found" : "Not Found") << std::endl; // Output: Not Found
    return 0;
}

总结

二叉搜索树是一种强大的数据结构,基于有序性实现了高效的查找、插入和删除操作。通过合理地比较键值大小,二叉搜索树能够在平均情况下实现O(log n)的时间复杂度。然而,不平衡的树可能会退化为链表,影响性能,因此引入了自平衡的二叉搜索树,如AVL树、红黑树等,以保持高效性能。深入理解和掌握二叉搜索树,将为你的编程技能和算法设计带来重要提升。

目录
相关文章
|
BI iOS开发
《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》——1.3 SAP ERP 概览
本节书摘来自华章计算机《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》一书中的第1章,第1.3节,作者 乐立骏,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3695 0
|
6月前
|
人工智能 API 定位技术
MCP全方位扫盲
MCP(Model Context Protocol)是由Anthropic提出的协议,旨在标准化大模型与外部数据源和工具的通信方式。其核心架构包括MCP Client(客户端)和MCP Server(服务端),通过标准化接口实现解耦,支持不同LLM无缝调用工具。相比传统方法,MCP简化了Prompt工程,减少定制代码,提升复用性。实际场景中,如天气查询或支付处理,MCP可智能调用对应工具,优化用户体验。MCP的核心价值在于标准化通信、统一工具描述及动态兼容性,成为大模型与外部服务的智能桥梁。
|
12月前
|
设计模式 存储 算法
分布式系统架构5:限流设计模式
本文是小卷关于分布式系统架构学习的第5篇,重点介绍限流器及4种常见的限流设计模式:流量计数器、滑动窗口、漏桶和令牌桶。限流旨在保护系统免受超额流量冲击,确保资源合理分配。流量计数器简单但存在边界问题;滑动窗口更精细地控制流量;漏桶平滑流量但配置复杂;令牌桶允许突发流量。此外,还简要介绍了分布式限流的概念及实现方式,强调了限流的代价与收益权衡。
522 12
|
移动开发 JavaScript 前端开发
HTML5 MathML好用的第三方库推荐
HTML5 的 MathML 对数学公式的展现至关重要,但因浏览器兼容性和复杂性问题,开发者常选用第三方库增强其功能。本文推荐了四个库:MathJax、KaTeX、MathML Cloud 和 jsMath。MathJax 兼容性好,支持多种格式;KaTeX 渲染速度快,适合现代浏览器;MathML Cloud 提供云端转换服务;jsMath 则适用于基本 MathML 支持。根据项目需求选择合适的库,能显著提升数学内容展示质量和用户体验。
|
Cloud Native Java 开发者
2023年对于Java技术而言
几个前沿技术
405 0
2023年对于Java技术而言
|
存储 监控 Java
(十一)彻悟并发之JUC分治思想产物-ForkJoin分支合并框架原理剖析上篇
在上篇文章《深入理解并发之Java线程池、工作原理、复用原理及源码分析》中,曾详细谈到了Java的线程池框架。在其中也说到了JDK提供的四种原生线程池以及自定义线程池,而本文则再来详细谈谈JDK1.7中新推出的线程池:ForkJoinPool。
198 1
|
算法 网络架构
|
网络协议 网络虚拟化 网络架构
MPLS VPN协议高级应用
MPLS VPN协议高级应用
|
存储 弹性计算 物联网
阿里云代金券、提货券、优惠券、储值卡领取及使用常见问题汇总
阿里云代金券、优惠券、提货券、储值卡是是阿里云最常见的几个优惠券种,官方发布这些券种的目的旨在为更多用户提供优惠上云的福利,代金券、优惠券、提货券、储值卡在性质及领取和使用上既有相同也有不同,下面是小编根据官方2024年的文档资料整理汇总的阿里云代金券、优惠券、提货券、储值卡领取及使用常见问题。
阿里云代金券、提货券、优惠券、储值卡领取及使用常见问题汇总
|
安全 前端开发 Java
Spring Security系列教程05--实现Form表单认证
前言 在上一章节中,一一哥 带大家认识了Spring Security中的第一种认证方式,但是这种基本认证的方式,UI效果不漂亮,安全性也很差,好像一无是处的样子,那么有没有更好一点的认证方式呢?有的!接下来我给大家介绍一个新的认证方式,即Form表单认证。 一. Form表单认证 1. 认证方式 我们从前文中得知,Spring Security中的认证方式可以分为HTTP层面和表单层面,常见的认证方式如下: • ①. HTTP基本认证; • ②. Form表单认证; • ③. HTTP摘要认证;
687 0