讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 怎么实现二叉搜索树 C++ BST插入查找删除代码【数据结构】

风磊大大_6162

风磊大大_6162

发布时间:2026-02-01 11:40:35

|

563人浏览过

|

来源于php中文网

原创

BST节点必须用指针(非值语义),构造函数显式初始化left/right为nullptr;insert需返回新节点并由上层赋值;delete双子节点时须用中序后继替换并递归删除;find推荐返回TreeNode*以支持后续修改。

c++ 怎么实现二叉搜索树 c++ bst插入查找删除代码【数据结构】

怎么写一个能用的 BST 节点结构

C++ 实现 BST 的起点不是算法,而是节点定义是否支持后续操作。常见错误是只存 val、不存 left 和 right 指针,或者用裸指针但没初始化为 nullptr,导致未定义行为。

  • 必须用指针(TreeNode* 或智能指针),不能用值语义嵌套对象(会无限递归构造)
  • 构造函数里把 left 和 right 显式设为 nullptr,避免野指针
  • 如果用 std::unique_ptr<treenode></treenode>,注意移动语义和 release() 的使用时机

示例最小可用节点:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

insert 递归实现为什么总崩在空节点插入

崩的原因几乎都是:递归到底层时传入的是局部指针副本,修改它不会影响上层的 root 或子节点指针。比如写成 node = new TreeNode(val),只是改了形参,父节点的 left 或 right 仍是 nullptr。

正确做法只有两种:

立即学习“C++免费学习笔记(深入)”;

  • 传指针的引用:void insert(TreeNode*& node, int val)
  • 返回新节点地址,由上层赋值:node->left = insert(node->left, val)

推荐后者,逻辑更清晰、无副作用。示例关键片段:

用于自动切换项目中适合的node 版本
用于自动切换项目中适合的node 版本

根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。

下载
TreeNode* insert(TreeNode* root, int val) {
    if (!root) return new TreeNode(val);
    if (val < root->val)
        root->left = insert(root->left, val);
    else
        root->right = insert(root->right, val);
    return root;
}

delete 节点时怎么处理有两个子节点的情况

这是 BST 删除最易错的部分。很多人直接删掉目标节点、把左右子树“拼”起来,结果破坏 BST 性质。正确方式是找中序后继(右子树最左节点)或中序前驱(左子树最右节点)来替换。

  • 选中序后继更常见:它一定没有左孩子,删它只需处理单子节点或叶子情况
  • 替换时不是交换值(虽然可行),而是用后继节点“顶替”被删节点位置,再删后继节点
  • 注意:后继节点可能位于右子树深层,删除它时仍要递归调用 deleteNode,不能手动 delete

关键逻辑节选:

TreeNode* deleteNode(TreeNode* root, int key) {
    if (!root) return nullptr;
    if (key < root->val)
        root->left = deleteNode(root->left, key);
    else if (key > root->val)
        root->right = deleteNode(root->right, key);
    else {
        if (!root->left) return root->right;
        if (!root->right) return root->left;
        // 找右子树最左节点(中序后继)
        TreeNode* successor = root->right;
        while (successor->left) successor = successor->left;
        root->val = successor->val;
        root->right = deleteNode(root->right, successor->val); // 递归删后继
    }
    return root;
}

find 查找函数要不要返回指针还是布尔值

取决于使用场景。如果只是判断存在性,返回 bool 最轻量;但如果后续要修改该节点(比如计数、打标记),必须返回 TreeNode*,否则得再查一遍。

  • 返回 TreeNode* 更通用,且与 insert/delete 接口风格一致
  • 注意:返回 nullptr 表示未找到,别和有效节点混淆;调用方必须判空
  • 不要用 static 局部变量或全局缓存来“优化”查找——BST 本身不保证平衡,缓存失效成本高,反而增加复杂度

示例简洁版:

TreeNode* find(TreeNode* root, int key) {
    if (!root || root->val == key) return root;
    return key < root->val ? find(root->left, key) : find(root->right, key);
}

BST 的难点不在代码行数,而在指针所有权和递归边界。哪怕只漏了一个 return root,或某次 delete 后没置空指针,运行时崩溃就很难定位。写完务必用三类 case 测:空树、单节点、左右子树都非空的根节点删除。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6959

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3325

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4348

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2965

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2721

2023.12.01

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 11万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 28.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn