news 2026/6/10 22:13: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/6/10 12:36:28

SSM毕设项目推荐-基于SSM+MySQL的网上商城系统开发基于SSM的网络商城【附源码+文档,调试定制服务】

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

作者头像 李华
网站建设 2026/6/9 23:56:13

Excel遗珠:揭秘宏表函数GET.WORKBOOK,一键获取所有工作表名

在Excel中&#xff0c;你是否曾为无法直接获取所有工作表名而烦恼&#xff1f;VBA虽强大但门槛高&#xff0c;公式函数又似乎无能为力。其实&#xff0c;Excel中隐藏着一类被称为“宏表函数”的强大工具&#xff0c;其中GET.WORKBOOK能轻松解决这一难题。 在Excel的进化长河中&…

作者头像 李华
网站建设 2026/6/10 5:41:59

科研级置信区间(CI)曲线可视化实战(Matplotlib)

在学术研究与统计分析中&#xff0c;置信区间&#xff08;Confidence Interval, CI&#xff09; 是描述参数估计不确定性与统计可靠性的核心指标。相比标准差&#xff08;SD&#xff09;与标准误&#xff08;SEM&#xff09;&#xff0c;CI 直接对应统计推断问题&#xff0c;更…

作者头像 李华
网站建设 2026/6/9 15:16:25

Java静态与终极:static和final详解

好的&#xff01;下面用简单易懂的方式解释 Java 中的 static 和 final 关键字&#xff1a; 1. static 关键字 static 表示 "静态的"&#xff0c;用于修饰成员&#xff08;变量、方法、代码块&#xff09;。它意味着该成员属于类本身&#xff0c;而不是类的某个实例…

作者头像 李华
网站建设 2026/6/9 18:44:40

运维人的尽头,只能是无休止的“救火”吗?

回想元旦放假第一天&#xff0c;热腾腾的早餐刚端上桌&#xff0c;手机微信的提示音就炸响了——客户发来急报&#xff1a;电子票据数据库 CPU 爆表&#xff01;那一瞬间&#xff0c;一股凉意直冲脊梁。 我不由得苦笑&#xff0c;上次是国庆&#xff0c;这次是元旦。多少次了&a…

作者头像 李华
网站建设 2026/6/10 14:13:03

数字滤波器设计中的精度问题

一、数字滤波器的误差源 数字滤波器不论是用物理硬件方法还是用计算机程序实现,都会由于字长的限制而产生误差,误差的原因一般可归纳为3种类型。 第一是由于滤波器系数表达精度有限引起的,它对所求的滤波器的传递特性和稳定性均有影响。由于非递归滤波器没有反馈结构,因此不…

作者头像 李华