跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

二叉树深度优先搜索技巧:计算布尔值与路径数字之和

二叉树深度优先搜索(DFS)用于解决布尔值计算与路径数字求和问题。通过递归分析子问题、确定出口条件及合并结果,可实现逻辑运算求值和路径数字累加。代码示例基于 Java 语言,展示前序遍历与后序遍历在二叉树问题中的具体实现逻辑。包含 LeetCode 2331 题与 129 题的详细解析与代码实现。

暖阳发布于 2026/3/23更新于 2026/5/69 浏览
二叉树深度优先搜索技巧:计算布尔值与路径数字之和

1. 计算二叉树中的布尔值

题目链接:2331. 计算布尔二叉树的值

题目内容

给你一棵完整二叉树的根,这棵树有以下特征:

  • 叶子节点要么值为 0 要么值为 1,其中 0 表示 False,1 表示 True。
  • 非叶子节点要么值为 2 要么值为 3,其中 2 表示逻辑或 OR,3 表示逻辑与 AND。

计算一个节点的值方式如下:

  1. 如果节点是个叶子节点,那么节点的值为它本身,即 True 或者 False。
  2. 否则,计算两个孩子的节点值,然后将该节点的运算符对两个孩子值进行运算。

返回根节点 root 的布尔运算值。

完整二叉树是每个节点有 0 个或者 2 个孩子的二叉树。叶子节点是没有孩子的节点。

二叉树结构示例

输入:root = [2,1,3,null,null,0,1] 输出:true 解释:上图展示了计算过程。AND 与运算节点的值为 False AND True = False。OR 运算节点的值为 True OR False = True。根节点的值为 True,所以我们返回 true。

示例 2: 输入:root = [0] 输出:false 解释:根节点是叶子节点,且值为 false,所以我们返回 false。

提示:

  • 树中节点数目在 [1, 1000] 之间。
  • 0 <= Node.val <= 3
  • 每个节点的孩子数为 0 或 2。
  • 叶子节点的值为 0 或 1。
  • 非叶子节点的值为 2 或 3。

分析

要想知道根节点的布尔值,就得先求左子树和右子树的布尔值。

递归代码步骤

  1. 大量重复子问题 (函数头): boolean dfs(TreeNode root)
  2. 只关注某一个子问题: 想知道根节点的布尔值,就得先求左子树和右子树的布尔值。
  3. 递归出口:
    • 节点值为 0,返回 false
    • 节点值为 1,返回 true

代码实现

class Solution {
    public boolean evaluateTree(TreeNode root) {
        return dfs(root);
    }

    public boolean dfs(TreeNode root) {
        if (root.val == 0) {
            return false;
        }
        if (root.val == 1) {
            return true;
        }
        boolean left = dfs(root.left);
        boolean right = dfs(root.right);
        return root.val == 2 ? left | right : left & right;
    }
}

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

题目链接:129. 求根节点到叶节点数字之和

题目内容

给你一个二叉树的根节点 root,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123。 计算从根节点到叶节点生成的所有数字之和。

叶节点是指没有子节点的节点。

示例 1: 示例 1 图示 输入:root = [1,2,3] 输出:25 解释:从根到叶子节点路径 1->2 代表数字 12,从根到叶子节点路径 1->3 代表数字 13。因此,数字总和 = 12 + 13 = 25

示例 2: 示例 2 图示 输入:root = [4,9,0,5,1] 输出:1026 解释:从根到叶子节点路径 4->9->5 代表数字 495,从根到叶子节点路径 4->9->1 代表数字 491,从根到叶子节点路径 4->0 代表数字 40。因此,数字总和 = 495 + 491 + 40 = 1026

提示:

  • 树中节点的数目在范围 [1, 1000] 内
  • 0 <= Node.val <= 9
  • 树的深度不超过 10

分析题意

以上图得 1 节点为例:

  1. 需要接收来自上一层的 49。
  2. 需要往下传递 49*10+1=491。
  3. 到达叶子节点,需要将结果返回。 分析出这三点,就不难写出递归代码了。

具体步骤

  1. 大量重复子问题 (函数头): 上一层节点×10+根节点传给子节点。直到叶子节点才返回最终结果。int dfs(root, presum)。presum 记录上一层的值。
  2. 某一子问题的工作流程:
    • 计算当前的值,presum*10+root.val;
    • 前序遍历递归左子树
    • 前序遍历递归右子树
  3. 递归出口: 当前节点为叶子节点时,返回结果。

代码实现

class Solution {
    public int sumNumbers(TreeNode root) {
        return dfs(root, 0);
    }

    public int dfs(TreeNode root, int presum) {
        presum = presum * 10 + root.val;
        if (root.left == null && root.right == null) {
            return presum;
        }
        int ret = 0;
        if (root.left != null) {
            ret += dfs(root.left, presum);
        }
        if (root.right != null) {
            ret += dfs(root.right, presum);
        }
        return ret;
    }
}

总结

凡是能用递归来解决的二叉树题目,要么是前序遍历,要么是后序遍历,还有一部分是中序遍历。大部分题都是这样的,一般可以先尝试前序,再后序,最后中序。

目录

  1. 1. 计算二叉树中的布尔值
  2. 题目内容
  3. 分析
  4. 递归代码步骤
  5. 代码实现
  6. 2. 求根节点到叶节点数字之和
  7. 题目内容
  8. 分析题意
  9. 具体步骤
  10. 代码实现
  11. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • AMDGPU 驱动架构概览
  • Web 创建与设计指南
  • MyLesson 微信小程序前台开发实战(一)
  • 【机器人零件】行星减速器
  • VSCode Copilot 接入智谱 GLM-5.1 配置指南
  • 命令行大模型交互工具 MCPHost 实战指南
  • Claude Code 源码泄露深度解析:架构、风控与隐藏功能复盘
  • FPGA 与 STM32 的 FMC 通信协议实现
  • Git 提交信息规范:Conventional Commits 详解
  • 人形运控部署框架汇总:rsl_rl 与 unitree_rl_gym 解析
  • 智能路灯与传感器 Web 管理平台渗透测试实战
  • 大模型:人工智能前沿技术与应用详解
  • 决策树算法在Java金融风控系统中的工程化实践
  • Linux 环境下 OpenClaw 安装、初始化与 Web UI 配置
  • 高可靠性电子产品 FPGA 逻辑设计
  • Stable Diffusion WebUI Rembg 扩展:AI 智能背景移除工具
  • Java 常见异常全面解析:出现场景、错误排查与代码修正实战
  • 无需 API:OpenCode 本地模型部署与配置实战
  • Windows 配置 JDK8 开发环境详解
  • Vivado 2020.2 安装教程:FPGA 开发环境搭建指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

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

  • Gemini 图片去水印

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