0

0

C++怎么实现二叉树_C++数据结构教程【递归】

尼克

尼克

发布时间:2026-03-02 11:17:36

|

229人浏览过

|

来源于php中文网

原创

bst递归插入需返回treenode*以更新父节点指针,中序遍历严格按左→根→右顺序;智能指针需用unique_ptr&参数并显式move;栈溢出时应改迭代或加深度保护;野指针访问属未定义行为。

c++怎么实现二叉树_c++数据结构教程【递归】

怎么用递归写 TreeNode 的插入和遍历函数

递归实现二叉搜索树(BST)插入和中序遍历,核心是抓住「当前节点为空时做什么」「非空时往哪走」这两个判断点。不是所有二叉树都适合递归,但 BST 的结构天然匹配递归分支逻辑。

常见错误现象:insert 函数没返回新节点指针,导致根节点始终为 nullptrinorder 打印顺序错乱,是因为左右子树调用顺序写反了。

  • 插入函数必须返回 TreeNode*,否则父节点无法接住新创建的子节点
  • 递归调用前要判空——if (root == nullptr) return new TreeNode(val);
  • 中序遍历严格按「左→根→右」顺序调用,少一个 inorder(root->left) 就漏一半节点
  • C++ 中传参用 TreeNode*&(引用)可省去返回赋值,但初学容易混淆,建议先用返回值方式

std::unique_ptr<treenode></treenode> 能不能直接递归操作

能,但接口行为和裸指针不同:移动语义会转移所有权,递归中途若意外复制或忘记 std::move,编译直接报错——这是好事,但新手常卡在「为什么 root->left 突然变成空」。

使用场景:需要自动内存管理、避免 delete 漏掉、或配合 RAII 容器时优先选 std::unique_ptr

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

凡科AI抠图
凡科AI抠图

简单好用的在线抠图工具

下载
  • 递归函数参数必须是 std::unique_ptr<treenode>&</treenode>(非常量引用),否则无法修改所指向的智能指针
  • 创建子节点要用 root->left = std::make_unique<treenode>(val);</treenode>,不能 new 后再构造
  • 调用子树递归时,需显式传递 *root->left 或用 root->left.get() 获取裸指针——但后者绕过所有权检查,不推荐
  • 性能影响几乎为零,但编译期检查更严,调试信息里看不到原始地址,gdb 查值需用 print root->left.get()->val

递归深度太大导致栈溢出怎么办

当树退化成链表(比如全升序插入),递归调用深度 ≈ 节点数,10⁵ 个节点大概率触发 stack overflow 错误,尤其 Windows 默认栈只有 1MB。

这不是代码写错了,是算法模型和数据分布共同导致的问题。

  • 加编译器栈大小参数(如 g++ -Wl,--stack=32*1024*1024)只是临时缓解,不解决根本
  • 改迭代:用 std::stack<treenode></treenode> 模拟调用栈,中序遍历需额外记录「是否已访问左子树」的状态
  • BST 插入本身可完全迭代实现——不需要栈,循环比较 + 指针移动即可,效率更高也更安全
  • 如果坚持递归,至少加深度保护:在函数开头加 static int depth = 0; if (++depth > 1000) throw std::runtime_error("recursion too deep");

为什么 delete 之后还访问 root->left 不报错但结果随机

因为 C++ 不清空已释放内存的内容,野指针读取是未定义行为(UB)。你看到的可能是旧值、脏数据,或者程序当场崩溃——取决于内存分配器状态和编译器优化级别。

这问题在递归销毁树时高频出现,尤其配合智能指针混用时。

  • 裸指针递归析构后,务必置空: delete root; root = nullptr;
  • std::unique_ptr 就不用手动 delete,但要注意:一旦执行 root.release(),就变回裸指针,后续行为同上
  • 调试时开启 AddressSanitizer(-fsanitize=address)能立刻捕获此类访问
  • 别依赖「看起来没崩」来判断正确性——UB 在不同机器、不同编译选项下表现完全不同
递归写二叉树最麻烦的从来不是语法,而是所有权归属和边界条件的耦合:什么时候该返回指针、什么时候该修改引用、什么时候该提前终止——这些地方一错,现象可能延迟几层调用才暴露。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

838

2023.08.22

string转int
string转int

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

910

2023.08.02

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

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

595

2024.08.29

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

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

294

2025.08.29

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

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

210

2025.08.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

43

2026.02.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号