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

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

二叉树深度优先遍历实战:计算布尔值与路径数字和。解析了两个经典算法题,演示了 DFS 的递归应用。首先讲解如何根据叶子节点值及内部节点的逻辑运算符自底向上计算布尔二叉树的值;随后展示如何利用前序遍历特性,在递归过程中累积路径数字,最终求得所有根到叶路径组成的整数之和。代码采用 C++ 实现,重点在于递归终止条件的判断与状态传递方式的选择。

赛博行者发布于 2026/3/24更新于 2026/10/1981 浏览
二叉树深度优先遍历实战:计算布尔值与路径数字和

深度优先遍历介绍

在树或图结构中,深度优先遍历(DFS)是一种基础且常用的算法。它尽可能深地搜索分支,直到路径结束再回溯。二叉树中常见的前序、中序和后序遍历,核心区别仅在于访问根节点的时机不同。由于树的定义本身具有递归性质,用递归实现这些遍历既直观又简洁。

在做题时,选择合适的遍历顺序对理解算法逻辑非常有帮助。下面我们通过两个经典题目来实战 DFS 的应用。

6. 计算布尔二叉树的值

题目描述

给定一棵非空二叉树,每个节点代表一个布尔值或逻辑运算。叶子节点值为 0(False)或 1(True)。非叶子节点值为 2(OR)或 3(AND)。需要返回根节点的计算结果。

解题思路

这是一个典型的后序遍历场景。我们需要先处理子节点,再根据当前节点的类型组合结果。

  1. 终止条件:如果当前节点是叶子节点,直接返回其值。
  2. 递归步骤:分别计算左右子树的值。
  3. 合并结果:若节点值为 2,返回左右子树值的 OR 运算;若为 3,返回 AND 运算。

C++ 代码实现

class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        // 叶子节点直接返回值
        if (!root->left && !root->right) {
            return root->val;
        }
        
        // 递归获取子节点结果
        bool leftVal = evaluateTree(root->left);
        bool rightVal = evaluateTree(root->right);
        
        // 根据节点类型进行逻辑运算
        return root->val == 2 ? (leftVal || rightVal) : (leftVal && rightVal);
    }
};

这里要注意,递归的终止条件非常关键。当遇到叶子节点时,我们不需要继续向下,直接返回即可。对于内部节点,我们利用逻辑运算符的特性将子问题的解合并。

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

题目描述

给定一个二叉树,每个节点的值都在 0-9 之间。从根节点到叶节点的路径可以表示为一个数字。例如路径 1->2->3 表示数字 123。要求计算所有根到叶路径表示的数字之和。

解题思路

这道题适合使用前序遍历。因为子节点的状态依赖于父节点传递过来的信息。

  1. 状态传递:在递归过程中,我们将父节点累积的数字乘以 10 加上当前节点的值,形成新的路径数值传递给下一层。
  2. 累加结果:当到达叶子节点时,说明一条完整路径结束,将该路径代表的数值加入总和。
  3. 回溯:递归返回时,左右子树的结果相加即为当前节点贡献的和。

C++ 代码实现

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        // 辅助函数,携带当前路径数值
        return dfs(root, 0);
    }
    
private:
    int dfs(TreeNode* node, int currentSum) {
        if (!node) return 0;
        
        // 更新当前路径数值
        currentSum = currentSum * 10 + node->val;
        
        // 如果是叶子节点,返回当前路径数值
        if (!node->left && !node->right) {
            return currentSum;
        }
        
        // 否则继续递归左右子树并累加
        return dfs(node->left, currentSum) + dfs(node->right, currentSum);
    }
};

相比直接在原树上修改节点值,使用辅助函数传递 currentSum 更加清晰且不会破坏原始数据结构,这是工程实践中更推荐的做法。

总结

通过这两个题目,我们可以看到 DFS 在不同场景下的灵活应用:

  • 计算布尔二叉树的值:侧重于自底向上的归约,利用后序遍历特性,先解决子问题再合并。
  • 求根节点到叶节点数字之和:侧重于自上而下的传递,利用前序遍历特性,在递归过程中维护状态。

掌握这两种模式,能帮助你更高效地解决大多数二叉树相关的递归问题。

目录

  1. 深度优先遍历介绍
  2. 6. 计算布尔二叉树的值
  3. 题目描述
  4. 解题思路
  5. C++ 代码实现
  6. 7. 求根节点到叶节点数字之和
  7. 题目描述
  8. 解题思路
  9. C++ 代码实现
  10. 总结

更多推荐文章

查看全部
  • AI 智能写作工具:自动生成万字长篇小说实践
  • 使用 Python 将 CSV 数据导入 Neo4j 图数据库
  • Spring IoC 依赖注入详解
  • 优雅降级 vs 渐进增强:前端兼容策略的“道”与“术”
  • AgentGen:通过环境和任务生成增强基于大模型的 Agent 规划能力
  • Kotaemon 与 GraphRAG 集成:构建高效文档问答系统
  • AI 绘画关键词推荐站的性能优化笔记
  • Telegram 搜索机器人推荐:高效检索海量资源
  • 大模型开发应用:从提示词到通用人工智能
  • 大数据岗位面试英文自我介绍实战指南
  • 国外主流 AI 大模型在国内的接入与使用指南
  • 小米 MiLoco 大模型智能家居本地部署指南
  • Python 异步编程简明指南:协程、任务与 asyncio
  • Spring AOP 注解实现详解
  • 大模型在低抽象层次任务中的表现与实践
  • C++ 测试与调试实战:保障代码质量与稳定性
  • 国产机器人开发平台 RDK-S100 硬件与 AI 功能评测
  • VSCode Copilot 接入智谱 GLM-5.1 配置指南
  • Midjourney 进阶:色相详解与色彩控制
  • AI 与存储结合:智能存储实践与挑战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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