news 2026/4/18 3:38:01

【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

二叉搜索树(Binary Search Tree, BST)的 C++ 简单实现
包含最常见的增、删、查、改操作,以及一些常用辅助函数。

以下代码尽量写得清晰、结构化,适合学习与理解。

#include<iostream>#include<queue>#include<vector>usingnamespacestd;// BST 节点定义structNode{intval;Node*left;Node*right;Node(intv):val(v),left(nullptr),right(nullptr){}};classBinarySearchTree{private:Node*root;// 辅助函数:递归插入Node*insertHelper(Node*node,intval){if(node==nullptr){returnnewNode(val);}if(val<node->val){node->left=insertHelper(node->left,val);}elseif(val>node->val){node->right=insertHelper(node->right,val);}// 相等时可以选择不插入(或覆盖/计数,此处选择不插入)returnnode;}// 辅助函数:查找节点(返回节点指针)Node*findHelper(Node*node,intval){if(node==nullptr||node->val==val){returnnode;}if(val<node->val){returnfindHelper(node->left,val);}else{returnfindHelper(node->right,val);}}// 辅助函数:找最小值节点(用于删除时找后继)Node*findMin(Node*node){while(node&&node->left){node=node->left;}returnnode;}// 辅助函数:删除节点(递归版)Node*removeHelper(Node*node,intval){if(node==nullptr){returnnullptr;}if(val<node->val){node->left=removeHelper(node->left,val);}elseif(val>node->val){node->right=removeHelper(node->right,val);}else{// 找到要删除的节点// 情况1:没有子节点(叶子)if(node->left==nullptr&&node->right==nullptr){deletenode;returnnullptr;}// 情况2:只有一个子节点elseif(node->left==nullptr){Node*temp=node->right;deletenode;returntemp;}elseif(node->right==nullptr){Node*temp=node->left;deletenode;returntemp;}// 情况3:有两个子节点 → 用右子树的最小节点替换else{Node*successor=findMin(node->right);node->val=successor->val;// 复制值node->right=removeHelper(node->right,successor->val);// 删除后继}}returnnode;}// 辅助函数:中序遍历(验证 BST 是否正确)voidinorderHelper(Node*node){if(node==nullptr)return;inorderHelper(node->left);cout<<node->val<<" ";inorderHelper(node->right);}// 销毁整棵树(析构函数调用)voiddestroyTree(Node*node){if(node==nullptr)return;destroyTree(node->left);destroyTree(node->right);deletenode;}public:BinarySearchTree():root(nullptr){}~BinarySearchTree(){destroyTree(root);}// 插入voidinsert(intval){root=insertHelper(root,val);}// 查找(是否存在)boolfind(intval){returnfindHelper(root,val)!=nullptr;}// 查找并返回节点指针(用于修改值)Node*findNode(intval){returnfindHelper(root,val);}// 删除voidremove(intval){root=removeHelper(root,val);}// 修改某个节点的值(先查找再修改)boolupdate(intoldVal,intnewVal){Node*node=findNode(oldVal);if(node==nullptr){returnfalse;}// 先删除旧值,再插入新值(最安全,避免破坏 BST 性质)remove(oldVal);insert(newVal);returntrue;}// 中序遍历(应该输出有序序列)voidinorder(){cout<<"中序遍历: ";inorderHelper(root);cout<<endl;}// 层序遍历(调试用)voidlevelOrder(){if(!root)return;queue<Node*>q;q.push(root);cout<<"层序遍历: ";while(!q.empty()){Node*node=q.front();q.pop();cout<<node->val<<" ";if(node->left)q.push(node->left);if(node->right)q.push(node->right);}cout<<endl;}// 判断是否为空boolempty()const{returnroot==nullptr;}// 获取根节点值(仅用于调试)intgetRootVal()const{returnroot?root->val:-1;}};// 测试代码intmain(){BinarySearchTree bst;// 插入测试vector<int>arr={50,30,70,20,40,60,80,15,25,35,45};for(intx:arr){bst.insert(x);}cout<<"插入后:"<<endl;bst.inorder();// 应该有序bst.levelOrder();// 查找cout<<"\n查找 40: "<<(bst.find(40)?"存在":"不存在")<<endl;cout<<"查找 100: "<<(bst.find(100)?"存在":"不存在")<<endl;// 修改(把 40 改为 42)cout<<"\n修改 40 → 42: "<<(bst.update(40,42)?"成功":"失败")<<endl;bst.inorder();// 删除cout<<"\n删除 30:"<<endl;bst.remove(30);bst.inorder();cout<<"\n删除 70(有两个孩子):"<<endl;bst.remove(70);bst.inorder();cout<<"\n删除 15(叶子节点):"<<endl;bst.remove(15);bst.inorder();return0;}

快速记忆要点(面试/刷题常用)

操作 | 时间复杂度(平均) | 时间复杂度(最坏) | 备注
—|—|—
查找 | O(log n) | O(n) | 最坏退化为链表
插入 | O(log n) | O(n) | 同上
删除 | O(log n) | O(n) | 两个孩子的情况最复杂
中序遍历 | O(n) | O(n) | 天然有序

常见面试追问方向

  1. 如何判断一棵二叉树是否是 BST?(中序遍历是否严格递增)
  2. 如何求 BST 的第 k 小元素?(中序遍历计数 / 记录子树大小)
  3. BST 如何转成双向链表?(中序遍历 + 指针调整)
  4. 如何在 BST 中找最近公共祖先?(类似二叉树 LCA,但利用大小关系更快)
  5. 如何实现一个支持重复元素的 BST?(在 Node 中加 count 字段)

需要哪一部分再展开讲解(比如删除两种写法对比、平衡 BST 引出 AVL/红黑树、BST 转链表代码等),可以直接告诉我~

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

【大数据毕设源码分享】基于Django+Spark的星云新能源汽车销售数据分析系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/4/16 11:03:38

技术演进中的开发沉思-329 JVM:垃圾回收(中)

在 JVM 的内存管理体系中&#xff0c;垃圾收集&#xff08;GC&#xff09;算法就是 “回收兵法”—— 不同算法有不同的 “战术特点”&#xff0c;有的追求效率&#xff0c;有的追求无碎片&#xff0c;有的兼顾两者。我早年做电商库存系统时&#xff0c;因对算法选型一知半解&a…

作者头像 李华
网站建设 2026/4/5 5:14:08

DeepSeek-R1-Distill-Qwen-1.5B进阶使用:自定义prompt模板设计

DeepSeek-R1-Distill-Qwen-1.5B进阶使用&#xff1a;自定义prompt模板设计 你是不是也遇到过这样的情况&#xff1a;同一个问题&#xff0c;换种说法&#xff0c;模型回答质量天差地别&#xff1f;明明模型标榜“擅长数学推理和代码生成”&#xff0c;可一问复杂逻辑题&#x…

作者头像 李华
网站建设 2026/4/11 17:44:13

MinerU输出管理技巧:相对路径设置避免文件丢失

MinerU输出管理技巧&#xff1a;相对路径设置避免文件丢失 MinerU 2.5-1.2B 是一款专为复杂 PDF 文档设计的深度学习提取工具镜像&#xff0c;特别擅长处理多栏排版、嵌套表格、数学公式和高分辨率插图等传统 OCR 工具难以应对的场景。它不是简单地把 PDF 转成文字&#xff0c…

作者头像 李华
网站建设 2026/4/16 19:53:46

基于SpringBoot的服装商城销售系统(源码+lw+部署文档+讲解等)

背景及意义 基于 SpringBoot 的服装商城销售系统&#xff0c;聚焦服装零售 “交易线上化、库存一体化、运营数据化” 的核心需求&#xff0c;针对传统服装销售 “线下记账繁琐、库存对账难、客户画像模糊” 的痛点&#xff0c;构建覆盖消费者、商家、仓库管理员、运营人员的全流…

作者头像 李华