news 2026/4/21 6:35:39

C++二叉搜索树:从原理到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++二叉搜索树:从原理到实战

好的,我们来学习二叉搜索树(Binary Search Tree, BST)在 C++ 中的基础实现。这是一种高效的数据结构,用于存储和检索数据。

二叉搜索树概述

二叉搜索树是一种特殊的二叉树,它满足以下性质:

  1. 每个节点都有一个关键值。
  2. 左子树中所有节点的关键值都小于其父节点的关键值。
  3. 右子树中所有节点的关键值都大于其父节点的关键值。
  4. 左右子树本身也必须是二叉搜索树。

这种结构使得查找、插入和删除操作的平均时间复杂度可以达到 $$O(\log n)$$。

C++ 实现要点

1. 节点结构定义

使用结构体TreeNode表示树中的节点,包含数据、指向左子树的指针和指向右子树的指针。

struct TreeNode { int val; // 节点存储的值 TreeNode *left; // 指向左子树的指针 TreeNode *right; // 指向右子树的指针 TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 构造函数 };
2. 基本操作
查找(Search)

从根节点开始,根据目标值与当前节点值的大小关系决定向左或向右子树搜索。

TreeNode* search(TreeNode* root, int target) { if (root == nullptr || root->val == target) return root; // 找到或树为空 if (target < root->val) return search(root->left, target); // 目标值小,搜索左子树 else return search(root->right, target); // 目标值大,搜索右子树 }
插入(Insert)

找到合适的空位置(遵循 BST 规则)插入新节点。

TreeNode* insert(TreeNode* root, int val) { if (root == nullptr) return new TreeNode(val); // 创建新节点 if (val < root->val) root->left = insert(root->left, val); // 插入左子树 else if (val > root->val) root->right = insert(root->right, val); // 插入右子树 return root; // 返回当前节点指针 }
删除(Delete)

删除操作需考虑三种情况:

  • 无子节点:直接删除。
  • 只有一个子节点:用子节点替代。
  • 有两个子节点:找到右子树的最小节点(或左子树的最大节点)替代被删节点,再删除该节点。
TreeNode* deleteNode(TreeNode* root, int key) { if (root == nullptr) return root; // 树为空 if (key < root->val) root->left = deleteNode(root->left, key); // 在左子树删除 else if (key > root->val) root->right = deleteNode(root->right, key); // 在右子树删除 else { // 找到要删除的节点 // 情况1:无子节点或只有一个子节点 if (root->left == nullptr) { TreeNode* temp = root->right; delete root; return temp; } else if (root->right == nullptr) { TreeNode* temp = root->left; delete root; return temp; } // 情况3:有两个子节点 TreeNode* temp = root->right; while (temp->left != nullptr) temp = temp->left; // 找到右子树的最小节点 root->val = temp->val; // 用最小节点的值覆盖 root->right = deleteNode(root->right, temp->val); // 删除那个最小节点 } return root; }

时间复杂度分析

  • 查找、插入、删除:平均时间复杂度 $$O(\log n)$$,最坏情况(树退化成链表)$$O(n)$$。
  • 遍历:中序遍历(Inorder Traversal)可以得到有序序列,时间复杂度 $$O(n)$$。

总结

二叉搜索树是 C++ 数据结构学习中的重要内容,理解其原理并掌握基本操作是实现更高级树结构(如 AVL 树、红黑树)的基础。请务必动手实践上述代码,加深理解。

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

如何批量修改SQL表注释_使用ALTER TABLE语句批量更新

MySQL不支持单条ALTER TABLE批量修改多表注释&#xff0c;必须逐表执行ALTER TABLE ... COMMENT语句&#xff1b;可通过information_schema查询拼接或shell脚本自动执行&#xff1b;PostgreSQL需用DO块配合quote_ident动态执行。MySQL 里 ALTER TABLE 不支持批量改表注释直接用…

作者头像 李华
网站建设 2026/4/21 6:33:32

Hadoop高可用技术综述

摘要随着大数据时代的到来&#xff0c;Hadoop作为开源的分布式系统基础架构&#xff0c;已成为处理海量数据的核心平台。然而&#xff0c;传统Hadoop 1.x版本中存在单点故障问题&#xff0c;特别是NameNode的失效会导致整个HDFS集群不可用。本文基于Hadoop高可用&#xff08;HA…

作者头像 李华
网站建设 2026/4/21 6:28:18

Loom响应式转型失败的8个隐性陷阱,90%团队在第3步就已埋下崩溃伏笔

第一章&#xff1a;Loom响应式转型的认知重构与价值重定义传统Java并发模型长期依赖线程栈绑定、阻塞式I/O与显式线程管理&#xff0c;导致高并发场景下资源开销陡增、可观测性弱、开发心智负担重。Project Loom 的虚拟线程&#xff08;Virtual Threads&#xff09;并非简单“轻…

作者头像 李华
网站建设 2026/4/21 6:23:20

real-anime-z惊艳效果展示:写实光影+细腻线条的真实动画风样例

real-anime-z惊艳效果展示&#xff1a;写实光影细腻线条的真实动画风样例 1. 模型简介 real-anime-z是基于Z-Image的LoRA版本模型&#xff0c;专注于生成具有写实光影效果和细腻线条的真实动画风格图片。这个模型在保留传统动画艺术风格的同时&#xff0c;通过先进的光影渲染…

作者头像 李华
网站建设 2026/4/21 6:21:20

【时空心法】别以为你写进了 RAM!撕碎“赋值即落盘”的内存幻觉,论 D-Cache 陷阱与 DMA 的物理数据撕裂

摘要&#xff1a;在纯软件的沙盒里&#xff0c;对变量的赋值意味着世界状态的瞬间改变。但在主频飙升的现代高端微控制器内部&#xff0c;CPU 与物理内存之间横亘着一道极其深邃的“时空延迟”——L1 数据缓存&#xff08;D-Cache&#xff09;。无数跨界开发者迷信于代码的执行…

作者头像 李华