从零开始掌握二叉搜索树(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:54阅读更多 →
仓库里堆的不是货,是真金白银 有色金属仓储:一个容错率为零的战场

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

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

2026/7/29 23:30:54阅读更多 →
robot_localization配置教程:EKF与UKF节点参数设置与最佳实践

robot_localization配置教程:EKF与UKF节点参数设置与最佳实践

robot_localization配置教程:EKF与UKF节点参数设置与最佳实践 【免费下载链接】ros-sensor-fusion-tutorial An in-depth step-by-step tutorial for implementing sensor fusion with robot_localization! 🛰 项目地址: https://gitcode.com/gh_mirro…

2026/7/29 23:28:54阅读更多 →
语音对话前端全链路:WebRTC 采集、流式 ASR 与 TTS 的工程落地

语音对话前端全链路:WebRTC 采集、流式 ASR 与 TTS 的工程落地

语音对话前端全链路:WebRTC 采集、流式 ASR 与 TTS 的工程落地 一、边说边听的难题:语音 AI 助手的实时性与打断困境 去年我们给一个车载语音助手做前端,验收时产品提了一条:"用户说话中途改主意,要能立刻打断 AI…

2026/7/30 0:51:03阅读更多 →
毕业论文写作全攻略:2026年一个月从开题到定稿的实战时间表

毕业论文写作全攻略:2026年一个月从开题到定稿的实战时间表

「还有一个月就要交初稿了,现在连题目都没定,来得及吗?」这是上周一个学妹问我的原话。我给了她一份去年自己用过的时间表,昨天她告诉我:开题报告过了,初稿已经完成一半。毕业论文写作最大的敌人不是能力&a…

2026/7/30 0:47:02阅读更多 →
JWT原理分析

JWT原理分析

JWT 认证完整链路——从登录到退出的每一步,都有一个真实项目在跑 我做过一个政务系统的认证模块,Java 从零实现了一套 JWT 认证——双 Token、黑名单、Cookie 和 Header 双通道提取、用户信息缓存、权限鉴权。这篇文章拆开这个模块的完整源码&#xff0…

2026/7/30 0:47:02阅读更多 →
容量测试到底测什么——一次对话理清同时在线和并发请求

容量测试到底测什么——一次对话理清同时在线和并发请求

容量测试到底测什么?一次对话理清"同时在线"和"并发请求" 和同事讨论容量测试,发现很多人把"同时在线"和"并发请求"搅在一起。这篇把这段对话记录下来,帮你看清容量的本质。 文章目录容量测试到底测…

2026/7/30 0:47:02阅读更多 →
大厂面试,自进化 agent 正在成为主流!

大厂面试,自进化 agent 正在成为主流!

最近社区学员反馈一些Agent 面经时,发现自进化 agent正在成为主流!今天从一道字节算法二面的题开始,带你看懂大厂真正想要什么样的人才能力。 👔 面试官:“human feedback 是怎么被 agent 消化吸收的?” …

2026/7/30 0:47:02阅读更多 →
AI提示词黄金模板库(覆盖12大行业+8类任务):2024最新实战验证版,仅开放72小时

AI提示词黄金模板库(覆盖12大行业+8类任务):2024最新实战验证版,仅开放72小时

更多请点击: https://codechina.net 第一章:AI提示词黄金模板库总览与核心设计哲学 AI提示词并非随意拼凑的语句,而是融合语言学、认知科学与工程实践的精密接口。黄金模板库的本质,是将人类意图结构化、可复用、可迭代的表达范式…

2026/7/30 0:47:02阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →