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

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

胖瑶吖_4470

胖瑶吖_4470

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

|

249人浏览过

|

来源于php中文网

原创

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

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

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

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

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

  • 插入函数必须返回 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++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 递归函数参数必须是 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工具

更多
SkildArt
SkildArt Hot

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

WorkBuddy

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

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

DeepSeek

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

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

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

2960

2023.09.27

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

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

249

2026.02.03

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

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

6104

2023.10.24

string转int
string转int

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

6499

2023.08.02

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

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

3165

2024.08.29

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

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

4068

2025.08.29

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

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

2805

2025.08.29

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

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

359

2026.04.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

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