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

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

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

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

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) {
             ;
        }
         (root.val == ) {
             ;
        }
           dfs(root.left);
           dfs(root.right);
         root.val ==  ? left | right : left & right;
    }
}
return
false
if
1
return
true
boolean
left
=
boolean
right
=
return
2

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. 总结

更多推荐文章

查看全部
  • Enterprise Architect 16 安装与配置指南
  • Qwen3-ASR-1.7B 赋能博物馆 AR 导览:语音转写与知识图谱联动
  • 十篇 AI Agent 研报解读 2025 年全球智能体行业全景
  • 通过 Vue 实例劫持突破 Web 编辑器粘贴限制
  • 基于腾讯云服务器、宝塔面板与 Nginx 部署云图库项目
  • 微信小程序 wx:if 指令使用与性能分析
  • C++ 游戏开发入门与进阶指南
  • AI 时代,写作是比编程更核心的元技能
  • Claude Code 命令行工具安装与实战指南
  • AudioSeal 在 Whisper 生成音频中检测并提取原始水印
  • OpenCore 安装指南:在 PC 上运行 macOS 的完整教程
  • CKS 认证考试核心题型实战解析与避坑指南
  • VS Code 中 GitHub Copilot 无法加载模型的排查与解决
  • Linux 基础操作与 Java 项目云端部署实战
  • GESP C++ 一级认证真题与解析:单选题 1-15
  • Java 冷热钱包架构与用户资产安全保护
  • HarmonyOS 6.0 OAID 服务正式支持 TV 设备
  • NVIDIA DGX Spark Ubuntu CUDA 13.0 安装 PyTorch GPU 版
  • C++ 深入:类与对象的默认成员函数及运算符重载
  • 零经验转行 AI:AGI 产品经理求职指南与面试准备

相关免费在线工具

  • 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