0

0

C++如何实现二叉树的深度计算_C++递归求树的高度算法实现【练习】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-07 09:30:10

|

369人浏览过

|

来源于php中文网

原创

二叉树高度递归计算核心是:空节点返回0,非空返回1+max(左子树高度,右子树高度);必须判空防崩溃,禁用全局变量;BFS可避免栈溢出但空间开销大;需严格统一“节点数”或“边数”定义。

c++如何实现二叉树的深度计算_c++递归求树的高度算法实现【练习】

递归计算二叉树高度的核心逻辑

二叉树的高度(深度)定义为从根节点到最远叶子节点的最长路径上的边数,或节点数——实际编码中需先明确约定。C++ 常见实现默认返回节点数(即根为 1 层),对应公式:height(root) = 1 + max(height(root->left), height(root->right)),空节点返回 0。

关键点在于:必须对左右子树分别递归,取较大值,再加 1;不能只遍历一边,也不能漏掉空指针判别。

  • 空节点必须返回 0(若按“边数”定义则返回 -1,但多数教材和 OJ 默认节点计数)
  • 递归调用前务必检查 root 是否为空,否则访问 root->left 会触发段错误
  • 不要在递归里维护全局变量或传引用计数——易错且破坏函数纯性

标准实现与常见错误写法对比

正确写法简洁直接:

int height(TreeNode* root) {
    if (!root) return 0;
    return 1 + std::max(height(root->left), height(root->right));
}

典型错误包括:

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

小K直播姬
小K直播姬

全球首款AI视频动捕虚拟直播产品

下载
  • 忘记空指针检查,直接写 height(root->left) → 运行时崩溃
  • 写成 return height(root->left) + height(root->right) + 1 → 计算的是“宽度相关量”,不是高度
  • if (root == nullptr) 判空但拼错为 if (root = nullptr) → 意外赋值,逻辑恒真
  • 返回类型用 void 配合参数引用输出 → 增加调用复杂度,无必要

非递归方式(BFS 层序遍历)适用场景

当树可能极深(如退化为链表)、担心溢出时,递归版有风险。此时改用 BFS 按层扫描更稳妥,时间 O(n),空间 O(w),w 为最大层宽。

核心思路:每处理完一层,高度 +1。用 queue 实现:

int height(TreeNode* root) {
    if (!root) return 0;
    queue q;
    q.push(root);
    int h = 0;
    while (!q.empty()) {
        int sz = q.size();
        h++;
        for (int i = 0; i < sz; ++i) {
            auto node = q.front(); q.pop();
            if (node->left) q.push(node->left);
            if (node->right) q.push(node->right);
        }
    }
    return h;
}
  • BFS 版天然避免递归栈限制,适合生产环境或超深树
  • 比 DFS 递归多用内存,尤其满二叉树下队列峰值达 O(2^h)
  • 不能提前退出——必须遍历到最后一层才知高度,而递归在回溯中自然得到最大值

LeetCode 或本地测试时要注意的细节

不同题目对“高度”定义可能不一致。例如 LeetCode #104 明确要求“maximum depth”,定义为节点数;但某些面试题或教材可能以边数为准(根到叶子的边数),此时空树高为 0,单节点高为 0。

  • 务必先读清题干中 depthheight 的定义,再决定 base case 返回 0 还是 -1
  • 若用 std::max,需包含 ;C++17 起支持 std::max({a,b}),但两参数版更通用
  • TreeNode 结构体若未定义,常见为:struct TreeNode { int val; TreeNode *left; TreeNode *right; };,注意指针初始化为 nullptr 而非 NULL

真正容易被忽略的,是定义一致性——同一项目里混用“节点数高度”和“边数高度”,会导致父子节点高度关系错乱,调试时极难定位。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

241

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

621

2024.03.01

if什么意思
if什么意思

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

798

2023.08.22

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

84

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

98

2025.09.18

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

196

2025.07.04

string转int
string转int

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

606

2023.08.02

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.9万人学习

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

共162课时 | 19.4万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.7万人学习

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

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