news 2026/5/6 7:53:28

C++二叉搜索树实现详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++二叉搜索树实现详解

以下是一个简单的二叉搜索树(Binary Search Tree, BST)的 C++ 实现,包含插入、删除、查找和遍历等基本操作:

#include <iostream> using namespace std; // 树节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; class BST { private: TreeNode* root; // 插入节点(递归辅助函数) TreeNode* insertHelper(TreeNode* node, int val) { if (!node) return new TreeNode(val); if (val < node->val) node->left = insertHelper(node->left, val); else node->right = insertHelper(node->right, val); return node; } // 查找最小节点(用于删除操作) TreeNode* findMin(TreeNode* node) { while (node->left) node = node->left; return node; } // 删除节点(递归辅助函数) TreeNode* deleteHelper(TreeNode* node, int val) { if (!node) return nullptr; if (val < node->val) node->left = deleteHelper(node->left, val); else if (val > node->val) node->right = deleteHelper(node->right, val); else { // 情况1:叶子节点或仅有一个子节点 if (!node->left) return node->right; if (!node->right) return node->left; // 情况2:有两个子节点 TreeNode* successor = findMin(node->right); node->val = successor->val; node->right = deleteHelper(node->right, successor->val); } return node; } // 中序遍历(递归) void inorderHelper(TreeNode* node) { if (!node) return; inorderHelper(node->left); cout << node->val << " "; inorderHelper(node->right); } public: BST() : root(nullptr) {} // 插入操作 void insert(int val) { root = insertHelper(root, val); } // 删除操作 void remove(int val) { root = deleteHelper(root, val); } // 查找操作 bool search(int val) { TreeNode* cur = root; while (cur) { if (val == cur->val) return true; cur = (val < cur->val) ? cur->left : cur->right; } return false; } // 中序遍历 void inorder() { inorderHelper(root); cout << endl; } }; int main() { BST tree; tree.insert(50); tree.insert(30); tree.insert(70); tree.insert(20); tree.insert(40); cout << "中序遍历: "; tree.inorder(); // 输出: 20 30 40 50 70 cout << "查找40: " << (tree.search(40) ? "存在" : "不存在") << endl; cout << "删除30后: "; tree.remove(30); tree.inorder(); // 输出: 20 40 50 70 }

核心操作说明

  1. 插入

    • 递归找到合适位置创建新节点
    • 时间复杂度:$O(h)$($h$为树高度)
  2. 删除

    • 分三种情况处理:
      • 叶子节点:直接删除
      • 单子节点:用子节点替换
      • 双子节点:用后继节点(右子树最小节点)替换
    • 时间复杂度:$O(h)$
  3. 查找

    • 从根节点开始逐层比较
    • 时间复杂度:$O(h)$
  4. 遍历

    • 中序遍历可输出有序序列
    • 时间复杂度:$O(n)$($n$为节点数)

注意:二叉搜索树的性能取决于树的高度$h$。理想情况下$h = \log_2 n$(平衡树),最坏情况下$h = n$(退化为链表)。如需优化可研究平衡二叉搜索树(如 AVL 树、红黑树)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 0:02:05

C++STL容器:高效编程必备指南

好的&#xff0c;我们来学习C STL中最常用的几种容器。STL&#xff08;Standard Template Library&#xff09;提供了多种高效的容器类型&#xff0c;用于存储和管理数据。1. vector&#xff1a;动态数组概念&#xff1a;可变大小的数组&#xff0c;支持随机访问&#xff08;通…

作者头像 李华
网站建设 2026/5/3 8:56:30

ScalingLaws-2022-Chinchilla-2:既然Dₒₚₜ/Nₒₚₜ≈20,为什么LLaMA系列用的D/N远大于20【Chinchilla比例:每个参数大约对应20个token】

“每个参数大约对应 20 个 token”(常被叫作 Chinchilla 比例)并不是一条“宇宙定律”。 你看到 LLaMA 系列的 token/参数 比值远大于 20,核心原因是:他们优化的目标、约束条件、以及用来拟合的“最优前沿(frontier)”都变了。 尤其从 Llama 3 开始,论文里甚至明确承认…

作者头像 李华
网站建设 2026/4/30 6:34:42

HTTP Content-Type

HTTP Content-Type 引言 HTTP协议中的Content-Type头字段是Web服务器与客户端之间进行数据交换的重要机制。它定义了服务器发送给客户端数据的类型,允许浏览器或其他客户端应用程序正确地处理和展示这些数据。本文将详细介绍HTTP Content-Type的用途、类型以及在实际应用中的…

作者头像 李华
网站建设 2026/5/5 12:04:04

VSCode 下如何检查 Vue 项目中未使用的依赖?

VSCode 下如何检查 Vue 项目中未使用的依赖&#xff1f; 文章目录 VSCode 下如何检查 Vue 项目中未使用的依赖&#xff1f;1. 使用 depcheck 工具&#xff08;推荐&#xff09;安装和使用&#xff1a;配置&#xff08;可选&#xff09;&#xff1a; 2. 使用 npm-check 工具3. V…

作者头像 李华
网站建设 2026/4/25 18:59:04

SSM计算机毕设之基于ssm的网上手机商城系统基于SSM的手机商城(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/2 14:48:22

开题报告 雅韵古诗词系统python爬虫

目录 雅韵古诗词系统Python爬虫简介爬虫技术实现要点数据处理与存储反爬策略应对应用场景扩展 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 雅韵古诗词系统Python爬虫简介 雅韵古诗词系统是一个基于Py…

作者头像 李华