从零开始掌握二叉搜索树(C++ 完整实现与深度解析)
二叉搜索树Binary Search Tree, BST是最基础、最经典的树形数据结构之一。它不仅是理解更高级树结构如 AVL 树、红黑树、B 树的基石在许多实际场景中也直接发挥作用。本文将从定义出发手把手带你用 C 实现一个完整的二叉搜索树并深入分析其性能与局限。一什么是二叉搜索树二叉搜索树 是一种特殊的二叉树它满足以下性质1若左子树非空则左子树上所有节点的值 均小于 根节点的值。2若右子树非空则右子树上所有节点的值 均大于 根节点的值。3左、右子树本身也各是一棵二叉搜索树。通常我们默认树中不存在值相等的节点若需支持重复键值可通过计数或规则约定处理本文以无重复为例。得益于这种有序性BST 能够以 O(h)的时间完成查找、插入、删除操作其中 h 是树的高度。最优情况下 hlog⁡n退化为链表时 hn。二节点定义与基本框架我们用 C 模板来实现以便支持不同数据类型。节点结构包含数据域、左右孩子指针。为便于管理内存这里使用原始指针并在析构函数中递归释放整棵树。templateclass T struct TreeNode { T _key; TreeNodeT* _left; TreeNodeT* _right; TreeNode(const T key) :_key(key) , _left(nullptr) ,_right(nullptr) { } }; templateclass T class BSTree { struct Less { bool operator()(const T x, const T y) { return x y; } }; struct Greater { bool operator()(const T x, const T y) { return x y; } }; typedef TreeNodeT Node; public: BSTree() :_root(nullptr) { } ~BSTree() { _postorder_traversal(_root); } private: void _postorder_traversal(Node* root) { if (root nullptr) return; _postorder_traversal(root-_left); _postorder_traversal(root-_right); delete root; } Node* _root;一查找从根节点开始若目标值等于当前节点值则找到若小于则进入左子树若大于则进入右子树。递归与非递归版本都很简洁。bool find(const T key)const { if (_root nullptr) return false; Node* root _root; while (root) { if (key root-_key) { root root-_left; } else if (key root-_key) { root root-_right; } else { return true; } } return false; }二插入插入的过程与查找类似寻找合适的位置即查找失败时所在的空位然后将新节点挂载上去。下图展示了插入的过程。bool insert(const T key) { Node* root _root; Node* parent nullptr; while (root) { if (Less()(key, root-_key)) { parent root; root root-_left; } else if (Greater()(key, root-_key)) { parent root; root root-_right; } else { return false; } } Node* newnode new Node(key); if (_root nullptr) { _root newnode; } else { if (Less()(key, parent-_key)) parent-_left newnode; else parent-_right newnode; } return true; }三删除删除操作需要处理三种情况1叶子节点直接删除。2只有一个孩子用其孩子替换该节点。3有两个孩子找到 后继节点左右都不为空找到左子树的最大节点或者右子树的最小节点本文是找左子树的最大节点右子树最小节点同理。然后将要删除的值与该节点的值交换交换之后再将其删除。bool erase(const T key) { Node* node _root; Node* parent nullptr; while (node) { if (key node-_key) { parent node; node node-_left; } else if (key node-_key) { parent node; node node-_right; } else { if (node-_left nullptr) { if (parent nullptr) _root _root-_right; else { if (parent-_left node) parent-_left node-_right; else parent-_right node-_right; } delete node; return true; } else if (node-_right nullptr) { if (parent nullptr) _root _root-_left; else { if (parent-_left node) parent-_left node-_left; else parent-_right node-_left; } delete node; return true; } else { //左右都不为空找到左子树的最大节点或者右子树的最小节点 Node* maxleft node-_left; Node* maxleftparent node; while (maxleft-_right) { maxleftparent maxleft; maxleft maxleft-_right; } swap(node-_key, maxleft-_key); if (maxleftparent-_left maxleft) maxleftparent-_left maxleft-_left; else maxleftparent-_right maxleft-_left; delete maxleft; return true; } } } return false; }三性能分析与退化问题理想情况下BST 高度 h≈log⁡2nh≈log2​n查找、插入、删除时间复杂度均为 O(log⁡n)O(logn)。但如果插入序列本身有序如1,2,3,4,5BST 将退化为一根“向右的链表”树高变为 nn时间复杂度恶化为 O(n)O(n)。这是基础 BST 的最大痛点。解决办法是使用 自平衡二叉搜索树如1AVL 树严格平衡左右子树高度差不超过 1查找极快但插入/删除旋转开销稍大。2红黑树近似平衡最长路径不超过最短路径的两倍综合性能优异是c std::map和std::set 的底层实现。3Treap、Splay 树利用随机优先级或访问局部性进行平衡。理解 BST 是进阶这些平衡树的前提。四总结二叉搜索树将“二分查找”的思想扩展到了动态数据结构上实现简单且功能强大。它让我们看到仅仅通过维护“左小右大”这一简单的规则就能高效组织、检索数据。而其退化的缺陷又顺理成章地引出了平衡树等数据结构。

相关新闻

QQ空间数据备份终极指南:如何一键导出你的青春记忆

QQ空间数据备份终极指南:如何一键导出你的青春记忆

QQ空间数据备份终极指南:如何一键导出你的青春记忆 【免费下载链接】QZoneExport QQ空间导出助手,用于备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、最近访客为文件,便于迁移与保存 项目地址: https://gi…

2026/7/29 23:30:59 阅读更多 →
仓库里堆的不是货,是真金白银 有色金属仓储:一个容错率为零的战场

仓库里堆的不是货,是真金白银 有色金属仓储:一个容错率为零的战场

有色金属仓储,和你在市面上看到的绝大多数仓库,有着本质区别。 这里放的,不是几块钱一瓶的饮料,不是几百块一件的衣服。是铜、是铝、是锌、是镍——每吨价格以万计,每垛货值动辄百万。 这不是仓库,这是一座…

2026/7/29 23:30:59 阅读更多 →
CD19靶向抗体药物偶联物能否改善复发难治性弥漫大B细胞淋巴瘤的临床结局?

CD19靶向抗体药物偶联物能否改善复发难治性弥漫大B细胞淋巴瘤的临床结局?

CD19靶向抗体药物偶联物能否改善复发难治性弥漫大B细胞淋巴瘤的临床结局?简述:抗体药物偶联物(ADC)通过将细胞毒药物精准递送至靶细胞,兼具高效与低脱靶毒性。Loncastuximab tesirine(Lonca)是一…

2026/7/29 23:30:59 阅读更多 →

最新新闻

ComfyUI-LTXVideo终极配置指南:5个技巧打造专业级AI视频生成工作流

ComfyUI-LTXVideo终极配置指南:5个技巧打造专业级AI视频生成工作流

ComfyUI-LTXVideo终极配置指南:5个技巧打造专业级AI视频生成工作流 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo是一个专为LTX-2视频模型设计的强…

2026/7/29 23:45:03 阅读更多 →
HackTricks:从零开始掌握网络安全攻防实战的终极指南

HackTricks:从零开始掌握网络安全攻防实战的终极指南

HackTricks:从零开始掌握网络安全攻防实战的终极指南 【免费下载链接】hacktricks Welcome to the page where you will find each trick/technique/whatever I have learnt in CTFs, real life apps, and reading researches and news. 项目地址: https://gitcod…

2026/7/29 23:45:03 阅读更多 →
如何高效使用Apollo配置中心的Open API:开发者实战指南

如何高效使用Apollo配置中心的Open API:开发者实战指南

如何高效使用Apollo配置中心的Open API:开发者实战指南 【免费下载链接】apollo Apollo is a reliable configuration management system suitable for microservice configuration management scenarios. 项目地址: https://gitcode.com/gh_mirrors/apoll/apollo…

2026/7/29 23:45:03 阅读更多 →
微店集成金蝶云星空旗舰版(金蝶AI星空)解决方案

微店集成金蝶云星空旗舰版(金蝶AI星空)解决方案

业务背景源系统成集云目标系统微店金蝶云星空旗舰版企业使用微店管理社交电商线上店铺运营、订单处理、商品管理、会员营销等业务,使用金蝶云星空旗舰版实现业财一体化核算。两套系统数据独立、流程割裂,导致商品信息重复维护、电商订单人工录入效率低、…

2026/7/29 23:45:03 阅读更多 →
霞鹜文楷:免费开源中文字体如何重塑中文排版体验?

霞鹜文楷:免费开源中文字体如何重塑中文排版体验?

霞鹜文楷:免费开源中文字体如何重塑中文排版体验? 【免费下载链接】LxgwWenKai An unprofessional open-source Chinese font derived from Fontworks Klee One. 一款非专业的开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生。 项目地…

2026/7/29 23:45:03 阅读更多 →
不下高速就入库:一家郑州仓储园区的侧面观察

不下高速就入库:一家郑州仓储园区的侧面观察

在郑州南城做批发和电商的老板,几乎都绕不开一道选择题:货往哪儿放。有意思的是,行业里名字最响的园区,未必是商户私下推荐最多的那家。大学南路绕城高速口旁,有一处占地约 3 万平方米的园区——郑州百业仓储&#xff…

2026/7/29 23:44:03 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻