跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二叉树深度优先遍历实战:计算布尔值与路径数字和

二叉树深度优先遍历是解决树形结构问题的核心方法。通过两道经典题目演示递归在 DFS 中的应用。第一题要求根据节点类型(叶子或运算符)计算布尔值,利用后序遍历思想自底向上求解;第二题计算从根到叶的路径数字和,需在前序遍历中维护当前路径数值并回溯累加。代码采用 C++ 实现,重点在于递归终止条件判断与状态传递逻辑。掌握这两种模式有助于处理更复杂的树形动态规划问题。

极客零度发布于 2026/3/29更新于 2026/6/1319 浏览
二叉树深度优先遍历实战:计算布尔值与路径数字和

深度优先遍历简介

深度优先遍历(DFS,Depth First Traversal)是处理树或图结构时最常用的算法之一。它的核心思想是尽可能深地搜索树的分支,直到一条路径上的所有节点都被访问完毕,然后回溯到上一层继续寻找其他路径。

在二叉树中,常见的 DFS 形式包括前序、中序和后序遍历。由于树本身的定义就是递归的,用递归来实现这三种遍历不仅直观,代码也非常简洁。三种遍历的唯一区别在于访问根节点的时机不同。在实际解题中,选择合适的遍历顺序往往能事半功倍。

6. 计算布尔二叉树的值

题目描述

给定一棵非空完整二叉树,每个节点代表一个布尔运算符或叶子节点。叶子节点值为 0(false)或 1(true)。非叶子节点值为 2(OR)或 3(AND)。要求返回根节点的值。

文章配图

示例

文章配图

解题思路

这道题本质上是一个自底向上的求值过程。我们可以利用后序遍历的思想来处理:

  1. 终止条件:当遇到叶子节点(没有左右子节点)时,直接返回该节点的值(0 或 1),因为叶子节点本身就代表了布尔结果。
  2. 递归步骤:对于非叶子节点,先递归计算左右子树的值。拿到子节点的结果后,根据当前节点的类型(2 代表 OR,3 代表 AND)进行逻辑运算。

这里有个小细节,为了简化代码,我们可以在递归过程中直接修改子节点的值来存储中间结果,这样就不需要额外的变量了。当然,如果不想破坏原树结构,可以返回新的布尔值,但在这种算法题中,原地修改通常是被允许的。

C++ 代码实现

/**
 * Definition for a binary tree node.
 * 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) {}
 * };
 */
class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        // 递归结束条件:叶子节点直接返回值
        if (root->left == nullptr && root->right == nullptr) {
            return root->val;
        }
        
        // 递归获取左右子树的值
        // 注意:这里利用了题目特性,将子节点的值更新为计算结果
        root->left->val = evaluateTree(root->left);
        root->right->val = evaluateTree(root->right);
        
        // 根据当前节点类型返回结果
        // 2 表示 OR,3 表示 AND
        return root->val == 2 ? (root->left->val || root->right->val) : (root->left->val && root->right->val);
    }
};

7. 求根节点到叶节点数字之和

题目描述

给定一棵二叉树,每个节点包含一个 0-9 的数字。从根到叶的路径代表一个数字(例如路径 1->2->3 代表数字 123)。求所有从根到叶路径所代表的数字之和。

文章配图

示例

文章配图

解题思路

这道题适合使用前序遍历(根 -> 左 -> 右),因为子节点的状态依赖于父节点传递过来的信息。

我们需要维护一个'当前路径数值'。每向下走一层,当前的数值就需要乘以 10 并加上当前节点的值。比如父节点是 1,当前节点是 2,那么路径数值就变成了 12。

关键点在于回溯:

  1. 状态传递:在递归调用时,将更新后的路径数值传递给下一层。
  2. 累加结果:当到达叶子节点时,说明找到了一条完整路径,将这个路径数值加入总和。
  3. 汇总:左右子树的结果相加,最终返回给上一层。

同样,为了演示方便,下面的代码也采用了修改节点值的技巧来传递状态,实际工程中建议通过参数传递避免副作用。

C++ 代码实现

/**
 * Definition for a binary tree node.
 * 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) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        // 叶子节点:直接返回自身值
        if (root->left == nullptr && root->right == nullptr) {
            return root->val;
        }
        
        int leftSum = 0, rightSum = 0;
        
        // 处理左子树
        if (root->left) {
            TreeNode* left = root->left;
            // 更新左子节点的值,相当于路径数值向前推进一位
            left->val = root->val * 10 + root->left->val;
            leftSum = sumNumbers(left);
        }
        
        // 处理右子树
        if (root->right) {
            TreeNode* right = root->right;
            // 同理更新右子节点的值
            right->val = root->val * 10 + root->right->val;
            rightSum = sumNumbers(right);
        }
        
        return leftSum + rightSum;
    }
};

流程解析

下图展示了第二道题在递归过程中的数值变化逻辑,帮助理解路径数值的累积方式:

文章配图

文章配图

目录

  1. 深度优先遍历简介
  2. 6. 计算布尔二叉树的值
  3. 题目描述
  4. 示例
  5. 解题思路
  6. C++ 代码实现
  7. 7. 求根节点到叶节点数字之和
  8. 题目描述
  9. 示例
  10. 解题思路
  11. C++ 代码实现
  12. 流程解析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 格拉姆角场(GAF)详解
  • 基于 ESP32 的无人机飞控 LOG 记录:SD NAND 存储方案测试
  • Python Web 自动化测试实战:常用函数全解析与场景化应用指南
  • 本地运行 AI 大模型电脑配置指南:避坑与提效实战
  • Qwen3.5-9B 如何以 1/13 参数量超越 GPT-oss-120B?架构与性能分析
  • 二分算法实战:查找元素首尾位置与区间计数
  • 二元交叉熵性质解析及其在 DPO 中的应用
  • Python 实现 AI 绘画用户评价自动分类与报告生成
  • Kali Linux 系统安装与基础配置指南
  • 滑动窗口算法详解:高效解决子数组与子串问题
  • Flutter 集成 Genkit 实现鸿蒙端 AI 流式响应与提示词管理
  • 二叉树算法实战:深度计算与先序排列求解
  • 力扣热题 100 精选解题思路与代码实现
  • 从零构建并训练基于 BERT 架构的生成式大模型
  • 国产 AI 智能体工具盘点:腾讯、阿里、字节等主流产品收录
  • Ubuntu 实体机与虚拟机安装及配置指南
  • 移动应用版本控制与发布流程指南
  • MySQL 环境配置实战:CentOS 7 与 Ubuntu 双系统安装指南
  • C++ 网络编程中的序列化和反序列化实现
  • RabbitMQ/Spring-AMQP 高级特性:事务机制与消息限流

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online