力扣二叉树四题解析:平衡判断与路径记录(C++实现)
1. 力扣刷题实战四道经典二叉树问题解析C实现最近在系统刷力扣的二叉树专题发现110、257、404、222这四道题特别有代表性涵盖了平衡判断、路径记录、左叶求和和节点计数等核心考点。今天就用C带大家手撕这四道题分享我的解题思路和踩坑经验。2. 解题环境准备与基础框架2.1 二叉树节点定义所有题目都基于相同的二叉树节点结构struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };2.2 递归与迭代的选择策略递归代码简洁适合对称性问题和路径追踪迭代显式栈/队列更直观适合层序遍历和特定顺序访问本系列优先展示递归解法同时提供迭代思路3. 题目110平衡二叉树判断3.1 问题重述给定二叉树判断它是否是高度平衡的左右子树高度差≤13.2 自顶向下解法初版int height(TreeNode* root) { if (!root) return 0; return 1 max(height(root-left), height(root-right)); } bool isBalanced(TreeNode* root) { if (!root) return true; return abs(height(root-left) - height(root-right)) 1 isBalanced(root-left) isBalanced(root-right); }问题存在重复计算时间复杂度O(nlogn)3.3 优化版自底向上int checkHeight(TreeNode* root) { if (!root) return 0; int left checkHeight(root-left); if (left -1) return -1; int right checkHeight(root-right); if (right -1) return -1; if (abs(left - right) 1) return -1; return 1 max(left, right); } bool isBalanced(TreeNode* root) { return checkHeight(root) ! -1; }关键改进在计算高度时直接判断平衡性时间复杂度优化到O(n)4. 题目257二叉树所有路径4.1 问题要求返回所有从根节点到叶节点的路径如[1-2-5,1-3]4.2 回溯法实现void constructPaths(TreeNode* root, string path, vectorstring paths) { if (!root) return; path to_string(root-val); if (!root-left !root-right) { paths.push_back(path); return; } path -; constructPaths(root-left, path, paths); constructPaths(root-right, path, paths); } vectorstring binaryTreePaths(TreeNode* root) { vectorstring paths; constructPaths(root, , paths); return paths; }4.3 迭代法实现栈模拟vectorstring binaryTreePaths(TreeNode* root) { vectorstring paths; if (!root) return paths; stackpairTreeNode*, string s; s.push({root, }); while (!s.empty()) { auto [node, path] s.top(); s.pop(); path to_string(node-val); if (!node-left !node-right) { paths.push_back(path); } else { path -; if (node-right) s.push({node-right, path}); if (node-left) s.push({node-left, path}); } } return paths; }5. 题目404左叶子之和5.1 关键定义左叶子节点需满足是父节点的左孩子自身是叶子节点无左右子树5.2 递归解法int sumOfLeftLeaves(TreeNode* root) { if (!root) return 0; int sum 0; if (root-left !root-left-left !root-left-right) { sum root-left-val; } return sum sumOfLeftLeaves(root-left) sumOfLeftLeaves(root-right); }5.3 迭代解法前序遍历int sumOfLeftLeaves(TreeNode* root) { if (!root) return 0; stackTreeNode* s; s.push(root); int sum 0; while (!s.empty()) { TreeNode* node s.top(); s.pop(); if (node-left) { if (!node-left-left !node-left-right) { sum node-left-val; } else { s.push(node-left); } } if (node-right) { s.push(node-right); } } return sum; }6. 题目222完全二叉树的节点个数6.1 普通二叉树解法通用int countNodes(TreeNode* root) { if (!root) return 0; return 1 countNodes(root-left) countNodes(root-right); }6.2 利用完全二叉树特性的优化int countNodes(TreeNode* root) { if (!root) return 0; int leftHeight 0, rightHeight 0; TreeNode* l root, *r root; while (l) { leftHeight; l l-left; } while (r) { rightHeight; r r-right; } if (leftHeight rightHeight) { return (1 leftHeight) - 1; // 2^h - 1 } return 1 countNodes(root-left) countNodes(root-right); }时间复杂度O(logN * logN)利用完全二叉树特性大幅优化7. 调试技巧与常见错误7.1 二叉树调试工具函数// 层次打印二叉树调试用 void printTree(TreeNode* root) { if (!root) return; queueTreeNode* q; q.push(root); while (!q.empty()) { int size q.size(); for (int i 0; i size; i) { TreeNode* node q.front(); q.pop(); cout node-val ; if (node-left) q.push(node-left); if (node-right) q.push(node-right); } cout endl; } }7.2 常见错误排查表错误现象可能原因解决方案平衡判断错误忽略子树也需要平衡递归检查每棵子树路径重复记录未及时回溯path变量使用string传值而非引用左叶误判未检查父节点关系增加父节点指针或标记计数超时未利用完全二叉树特性先计算左右子树高度8. 性能对比与进阶思考8.1 四题解法性能对比题号暴力解法优化解法提升幅度110O(nlogn)O(n)10x (n10000)257O(n)O(n)代码更简洁404O(n)O(n)迭代节省栈空间222O(n)O(log²n)100x (n1e5)8.2 相似题目扩展111题最小深度注意与最大深度的区别112题路径总和回溯法的经典应用226题翻转二叉树分治思想入门543题二叉树直径高度计算的变种在实际面试中建议先确认二叉树的类型普通/完全/满再选择最优解法。对于平衡二叉树问题微软和亚马逊常考变形题路径问题则是字节跳动的常见题型。

相关新闻

FPGA入门实战:从环境搭建到呼吸灯项目完整开发指南

FPGA入门实战:从环境搭建到呼吸灯项目完整开发指南

最近在整理FPGA学习资料时,发现很多初学者在入门阶段容易陷入"看理论多、动手少"的困境。本文将以最基础的FPGA开发板为例,手把手带你完成从环境搭建到第一个实际项目的完整流程,涵盖工具安装、代码编写、仿真验证和硬件调试全环节…

2026/10/18 1:18:34 阅读更多 →
Aspen 安装教程(2026亲测)Aspen Plus V15下载

Aspen 安装教程(2026亲测)Aspen Plus V15下载

Aspen Plus是一款面向化工、石化、炼油等领域的大型通用流程模拟系统,广泛应用于生产装置的稳态模拟与优化,是行业生产和学习的必备工具。接下来就为大家带来Aspen Plus V15的完整安装流程,涵盖Aspen Plus 下载后的解压、安装及配置全环节。 …

2026/10/10 20:50:41 阅读更多 →
当代年轻人社交新语:‘See_you‘:‘Next Moment‘现象解析

当代年轻人社交新语:‘See_you‘:‘Next Moment‘现象解析

1. 项目概述:当"See_you"遇见"Next Moment" "See_you":"Next Moment"这个看似简单的短语组合,实际上蕴含着当代年轻人特有的告别哲学。不同于传统"再见"的确定性,这种表达将离别转化为一个…

2026/10/17 18:07:54 阅读更多 →

最新新闻

Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

1. 这个报错到底在说什么Failed to initialize NVML: Driver/library version mismatch这行字,但凡在 Linux 上跑过深度学习训练、折腾过显卡直通、或者手贱升级过一次系统内核的人,大概率都见过。它的字面意思很直白:NVML 初始化失败&#x…

2026/10/18 13:26:59 阅读更多 →
迈迪三维设计工具:SolidWorks国标件参数化建模加速方案

迈迪三维设计工具:SolidWorks国标件参数化建模加速方案

简介:迈迪三维设计工具集是专为SolidWorks平台开发的专业级机械设计辅助插件,面向机械工程师、产品设计师及高校相关专业师生,旨在提升标准件建模、结构设计与工程图生成效率。资源包共2000个文件,总大小211.97MB,涵盖…

2026/10/18 13:26:59 阅读更多 →
JDBC从入门到精通:连接、预编译、事务与连接池实战

JDBC从入门到精通:连接、预编译、事务与连接池实战

做Java开发的朋友,应该都对JDBC不陌生。它就像是Java世界和数据库之间的一座桥,不管是传统的业务系统,还是后面对接MyBatis、Hibernate这类ORM框架,底层真正干活的还是JDBC。可以说,只要你想在Java里操作数据库&#x…

2026/10/18 13:26:59 阅读更多 →
如何查看电脑开机时间?四种系统自带方法实测与解读

如何查看电脑开机时间?四种系统自带方法实测与解读

1. 为什么非要搞清楚电脑的开机时间先说个场景,不知道你有没有遇到过:新装了一台电脑,或者刚重做完系统,总感觉开机慢得像老牛拉车。这时候你想评估一下到底是硬件不行,还是系统没优化好,最直接的一个指标就…

2026/10/18 13:26:59 阅读更多 →
Linux下NVIDIA驱动NVML版本不匹配报错排查与修复指南

Linux下NVIDIA驱动NVML版本不匹配报错排查与修复指南

1. 这个报错到底在说什么如果你在 Linux 环境下用nvidia-smi查显卡状态,终端冷不丁甩出一句Failed to initialize NVML: Driver/library version mismatch,那基本可以确定一件事:你机器上正在运行的 NVIDIA 内核驱动版本,和你当前…

2026/10/18 13:26:59 阅读更多 →
Java在线教育平台源码解析:DWD-DWS-DIM分层架构与毕设实战指南

Java在线教育平台源码解析:DWD-DWS-DIM分层架构与毕设实战指南

简介:这是一套面向Java开发者与教育信息化建设者的在线教育平台6.2版本完整设计源码,聚焦教学管理、课程学习、在线考试与数据治理等核心场景,适用于高校IT课程实践、教育类毕业设计或中小型在线教育系统二次开发。资源共69个文件&#xff0c…

2026/10/18 13:25:59 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →