《C++二叉搜索树原理剖析:从原理到高效实现教学》

《C++二叉搜索树原理剖析:从原理到高效实现教学》
前引:二叉搜索树(Binary Search Tree, BST)作为一种基础且强大的数据结构,凭借其高效的查找与插入效率,成为算法设计与内存优化的核心工具。在C++中,BST不仅能实现高效的数据管理,更为平衡树(如AVL树)奠定理论基础。本文将深入剖析BST的有序性本质(结合C++特性详解插入、删除、遍历等关键操作,并提供内存安全的现代C++实现范式!

目录

【一】二叉搜索树介绍

【二】特点剖析

【三】二叉搜索树实现

(1)结构创建

(2)插入节点

(3)中序遍历

(4)查找节点

(5)删除节点

(6)析构

(7)拷贝构造


【一】二叉搜索树介绍

二叉搜索树又称二叉排序树,我们根据它的名字猜到是一颗二叉树完成了排序的工作?二叉树如何排序?下面我们来看看它和我们之前学习的大小顶堆有和区别!

【二】特点剖析

例如下面一棵二叉搜索树(可以为空树):

二叉搜索树语言描绘特征如下:

(1)从第一个父节点(根节点)开始,它的左子节点小于父节点

(2)从第一个父节点(根节点)开始,它的右子节点大于父节点

(3)它的左右子树也分别为二叉搜索树

【三】二叉搜索树实现

(1)结构创建

实现一棵二叉搜索树,我们需要一个节点结构、一个功能结构

节点结构里面有左右子节点(left,right)、一个数据存储变量(date):

注意:主模板的声明不允许使用模板参数

功能结构用来实现二叉搜索树的功能:
(2)插入节点

插入节点我们需要根据数据的大小来判断插在左右节点的 nullptr 位置,我们这里挑战循环来写

注意:我们需要用其它节点代替node去移动,不然node每次都不是指向根节点的

//插入节点 void Insert(const T& date) { //如果根节点为空 if (node == nullptr) { node = new Node(date); return; } //根据数据大小查找 Node* parent = nullptr; Node* cur = node; while (cur) { //记录父节点 parent = cur; //如果小于父节点 if (date < cur->date) { cur = cur->left; } else { cur = cur->right; } } //此时已经到了节点为空的位置 //如果小于父节点 if (date < parent->date) { //插在父节点左侧 parent->left = new Node(date); return; } else { //插在父节点右侧 parent->right = new Node(date); return; } }
(3)中序遍历

中序我们调用递归来完成:先遍历左子树,然后父节点,然后右子树

//中序遍历 void Inorder() { _Inorder(node); } void _Inorder(Node* ptr) { //遇到空就返回 if (ptr == nullptr) { return; } _Inorder(ptr->left); cout << ptr->date << " "; _Inorder(ptr->right); }
效果展示:

(4)查找节点

找到对应节点之后,然后返回即可:

根据要找的数据大小去查找,那么最多查找次数就是二叉树的深度次

//查找数据 bool Find(const T& date) { //如果为空树,返回 if (node == nullptr) { return false; } Node* cur = node; //找节点 while (cur) { //如果date大于父节点,右边找,否则左边找 if (date > cur->date) { cur = cur->right; } else if(date < cur->date) { cur = cur->left; } else { return true; } } //如果出循环了还没有返回就说明没有找到 return false; }
效果展示:

(5)删除节点

删除节点我们需要考虑下面这三个情况(重点是比较节点数据大小):

(1)该节点无孩子节点:先删,然后置空

(2)该节点有一个孩子节点:先连接再删

注意:这两种情况可以概括为一类,参考下面代码注释,比较简单我们就直接看代码
(3)该节点有两个孩子节点:我们需要找一定大小的节点去替代它

替代思路:让它的左子树最大值或者右子树最小值去替换,然后删除它(左子树max为例)

·

解释:例如下面这幅图,我们要删除3



(1)先找到目标节点cur(3),然后找目标节点左子树的最大值left_max

(2)交换目标节点cur和最大值 light_max的数据

(3)这里需要标记 lleft_max的父节点为 parent

第一种情况:

(4)因为找的是左子树的最大值,所以只可能父节点parent的右边还存在子节点

         将它连接在parent的右边

(5)再将cur指向 left_max,删除

第二种情况:



(4)因为找的是左子树的最大值,可能 parent 的左边还存在子节点

(5)再将cur指向 left_max,删除


效果展示:

(6)析构

我们可以利用上面的“删除节点”+“根节点是否为空循环”来不断析构

注意:上面我们的析构是利用第三方指针cur代替node删除的,所以当二叉树只有一个根节点删除             后需要考虑置空,这样才可以利用到循环

//析构 ~BST() { while (node) { Erase(node->date); cout << "删除成功" << endl; } }

测试:

(7)拷贝构造

拷贝构造我们可以利用递归遍历不断开新节点

注意:递归左右节点时要连接起来,下面有详细的批注

//拷贝构造 BST(const BST<T>& ptr) { //如果拷贝对象是空 if (ptr.node == nullptr) { return; } //这里的ptr是拷贝的对象,node是待拷贝的对象的根节点 node = Copy(node, ptr.node); } Node* Copy(Node* _node,Node* copy_node) { if (copy_node == nullptr) { return nullptr; } //前序拷贝 _node = new Node(copy_node->date); // 空间是开辟成功了,但是这里node的左右子树,没有连接,需要接收copy的返回值才能完成连接 _node->left = Copy(_node->left, copy_node->left); _node->right = Copy(_node->right, copy_node->right); //返回根节点 return _node; }

效果展示:

Read more

AI安全:视觉提示词注入攻击代码/实战教学| 针对Hugging Face开源大模型Stable Diffusion Model

AI安全:视觉提示词注入攻击代码/实战教学| 针对Hugging Face开源大模型Stable Diffusion Model

提到提示词注入(Prompt Injection),大家的第一反应往往是精心构造的文本越狱指令。 而在图生图任务中,输入图像在本质上扮演了视觉提示词的角色,与文本指令共同指导生成模型。 基于这一视角,本文展示针对视觉提示词的注入攻击:通过PGD对抗攻击算法对输入图像进行像素级微调,使其生成的违规图像能够绕过开源大模型的NSFW安全检测机制。 临近毕业,感觉市场对提示词注入比较感兴趣,因本人读博期间一直研究对抗攻击算法,所以决定尝试用对抗攻击的思路完成提示词注入攻击,误导开源模型生成违规图像。 完整代码链接:https://github.com/YujiangLi0v0/Injection_Attack_Inpainting.git 目录 * 一、 NSFW防线:开源模型的安全过滤机制 * 二、 攻击场景定义 (Threat Model) * 三、 环境搭建 * 四、 核心攻击流程详解 * 4.1. 固定随机因子 * 4.2 数据预处理 * 4.3. 攻击部分 * 4.3.1 重写扩散模型推理过程

By Ne0inhk
美国加码机器人+中国低成本量产:具身AI冲击印度2.3亿零工经济,劳动力市场危机倒逼转型

美国加码机器人+中国低成本量产:具身AI冲击印度2.3亿零工经济,劳动力市场危机倒逼转型

摘要:美国启动千亿级机器人与具身 AI 战略(含研发补贴、产学研协同),中国低成本人形机器人量产成本跌破 5000 美元,双重夹击下印度 30% 劳动力(2.3 亿人)依赖的零工经济(配送、家政、护理、驾驶)面临替代风险。印度当前聚焦生成式 AI 与白领岗位保护,忽视底层劳动力转型,或将导致福利负担激增、中产挤压,FII 长期净卖出背后暗藏劳动力市场深层隐忧,政策调整窗口期仅剩 3-5 年。 引言:被忽视的 “底层冲击”,印度劳动力市场的隐形风暴 2025 年,全球科技竞争进入 “具身 AI 落地期”:美国宣布投入 1200 亿美元推动机器人与具身 AI 研发(含 500 亿企业补贴、

By Ne0inhk
(3-3)机器人身体结构与人体仿生学:四肢结构设计原则

(3-3)机器人身体结构与人体仿生学:四肢结构设计原则

3.3  四肢结构设计原则 四肢是人形机器人实现运动执行、负载作业与人机交互的核心执行单元,其设计需围绕“运动灵活性、承载可靠性、轻量化集成”三大核心目标,平衡关节运动范围、驱动效率与力传递性能。 3.3.1  手臂结构:肩、肘、腕的解耦设计 手臂作为人形机器人实现抓取、操作、人机交互的核心执行部件,其运动灵活性与控制精度直接依赖于肩、肘、腕关节的“解耦设计”——即通过结构布局与驱动配置,使各关节自由度运动独立可控,避免运动干涉与动力耦合,同时兼顾负载传递效率与轻量化需求。 图3-9展示了肩部、肘部、腕部的解耦设计,具体说明如下所示。 1. 肩部清晰区分了“前屈/后伸、外展/内收、旋转”三个独立自由度,搭配电机+谐波减速器的独立驱动配置,符合肩部三自由度解耦的球铰式布局; 2. 肘部标注“单自由度肘关节”,聚焦屈伸功能,配合行星减速器,

By Ne0inhk

养龙虾-------【多openclaw 对接飞书多应用】---多个大龙虾机器人群聊

🚀 MiniMax Token Plan 惊喜上线!新增语音、音乐、视频和图片生成权益。邀请好友享双重好礼,助力开发体验! 好友立享 9折 专属优惠 + Builder 权益,你赢返利 + 社区特权! 👉 立即参与:https://platform.minimaxi.com/subscribe/token-plan?code=2NMAwoNLlZ&source=link 最近玩了下大龙虾,对接飞书后玩的不亦乐乎,妥妥滴私人助理。但是也萌发一个想法,多个机器人可以自己聊天吗?那会不会把世界给聊翻了。于是我马上搜寻各个配置方式,却是找到了可以配置多个机器人得群聊方式。 1.首先创建多个应用添加机器人,分别和部署得多个openclaw系统对接具体对接参考我写的【 养龙虾-------【openclaw 对接飞书、钉钉、微信 】—移动AI助理】 2.手工拉群并添加机器人: 3.把群id配置进各个龙虾配置文件里面 接下来就可以群聊了

By Ne0inhk