当前位置: 首页 > ops >正文

华为OD机试真题——传递悄悄话(二叉树最长路径问题)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 A卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《传递悄悄话(二叉树最长路径问题)》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:传递悄悄话(二叉树最长路径问题)


  1. 知识点:二叉树、DFS/BFS、路径和计算
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要的时间。初始时,根节点的人有一个悄悄话要传递给其他人。计算所有节点都接收到悄悄话的最长时间(即从根节点到最远叶子节点的路径时间和)。

输入描述
一行整数序列,表示二叉树的层序遍历结果,-1表示空节点。例如:
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2

输出描述
一个整数,表示所有节点接收悄悄话的最长时间。例如输入上述序列,输出38(路径0→20→7→3→2的时间总和)。

示例说明

  • 输入0 -1 10 -1 -1,输出10(路径0→10)。
  • 输入0 3 4 -1 -1 -1 -1,输出4(路径0→4)。

Java

问题分析

题目要求计算二叉树中从根到最远叶子节点的路径时间和。每个节点的值表示父节点到该节点的传递时间,要求找到所有节点接收悄悄话的最长时间。

解题思路

  1. 构建二叉树:根据输入的层序遍历数组构建二叉树结构,其中 -1 表示空节点。
  2. 深度优先搜索 (DFS):遍历所有从根到叶子的路径,计算路径时间和的最大值。路径和为路径上所有节点值的总和(包括根节点)。

代码实现

import java.util.*;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String line = sc.nextLine();Integer[] nums = parseInput(line);TreeNode root = buildTree(nums);int max = dfs(root, 0); // 计算路径和(包含根节点)System.out.println(max);}// 将输入字符串解析为 Integer 数组(处理 -1)private static Integer[] parseInput(String line) {String[] parts = line.split(" ");Integer[] nums = new Integer[parts.length];for (int i = 0; i < parts.length; i++) {if (parts[i].equals("-1")) {nums[i] = null;} else {nums[i] = Integer.parseInt(parts[i]);}}return nums;}// 构建层序二叉树private static TreeNode buildTree(Integer[] nums) {if (nums == null || nums.length == 0 || nums[0] == null) return null;TreeNode root = new TreeNode(nums[0]);Queue<TreeNode> queue = new LinkedList<>();queue.add(root);int i = 1;while (!queue.isEmpty() && i < nums.length) {TreeNode node = queue.poll();// 处理左子节点if (i < nums.length && nums[i] != null) {node.left = new TreeNode(nums[i]);queue.add(node.left);}i++;// 处理右子节点if (i < nums.length && nums[i] != null) {node.right = new TreeNode(nums[i]);queue.add(node.right);}i++;}return root;}// DFS 计算从根到叶子的最大路径和private static int dfs(TreeNode node, int currentSum) {if (node == null) return currentSum; // 空节点返回当前和currentSum += node.val; // 累加当前节点值if (node.left == null && node.right == null) {return currentSum; // 叶子节点返回总和}int leftSum = dfs(node.left, currentSum);int rightSum = dfs(node.right, currentSum);return Math.max(leftSum, rightSum);}
}

代码解析

  1. 输入处理
    • parseInput 将输入字符串转换为 Integer 数组,-1 转为 null
  2. 构建二叉树
    • 使用队列按层序处理每个节点的左右子节点,null 表示空节点。
  3. DFS 计算路径和
    • 递归遍历所有路径,累加节点值,叶子节点返回路径和,非叶子节点返回左右子树的最大路径和。

示例测试

  1. 示例输入

    0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
    

    输出40
    解释:路径 0 → 20 → 15 → 3 → 2 的和为 0 + 20 + 15 + 3 + 2 = 40

  2. 测试用例1
    输入

    0 -1 10 -1 -1
    

    输出10
    解释:路径 0 → 10 的和为 0 + 10 = 10

  3. 测试用例2
    输入

    0 3 4 -1 -1 -1 -1
    

    输出4
    解释:路径 0 → 4 的和为 0 + 4 = 4

综合分析

  1. 时间复杂度:O(n)
    • 构建二叉树和 DFS 遍历各需一次线性遍历。
  2. 空间复杂度:O(n)
    • 存储二叉树和递归栈空间。
  3. 正确性保证
    • DFS 确保遍历所有路径,取最大值逻辑正确。
  4. 适用性
    • 适用于题目约束(n ≤ 20000,节点值 ≤ 10000),能处理大规模输入。

python

问题分析

题目要求计算从二叉树根节点到最远叶子节点的路径时间和的最大值。每个节点的值表示父节点到该节点的传递时间。例如,路径根节点→A→B的时间总和为父节点到A的时间加上A到B的时间。

解题思路

  1. 构建二叉树:根据输入的层序遍历数组构建二叉树,其中 -1 表示空节点。
  2. 深度优先搜索 (DFS):递归计算所有从根到叶子的路径时间和,取最大值。路径和为路径节点的值之和。

代码实现

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef build_tree(level_order):"""根据层序遍历数组构建二叉树:param level_order: 层序数组,-1转换为None:return: 根节点"""if not level_order or level_order[0] is None:return Noneroot 
http://www.xdnf.cn/news/8867.html

相关文章:

  • 微软技术赋能:解锁开发、交互与数据潜力,共探未来创新路
  • SDL2常用函数:SDL_BlitSurfaceSDL_UpdateWindowSurface 数据结构及使用介绍
  • 深度解析 vm.max_map_count:用途、原理与调优建议
  • 篇章三 数据结构——前置知识(三)
  • 我们是如何为 ES|QL 重建自动补全功能的
  • 常见的css布局单位
  • 深度解析C语言数据类型:从char到double的存储秘密
  • Flutter图片Image、本地图片、程程图片、圆片剪切、圆形图片
  • 小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解
  • Vue3解决路由缓存问题
  • 剑指offer11_矩阵中的路径
  • 鸿蒙OSUniApp 制作动态生成的轮播图#三方框架 #Uniapp
  • MyBatis入门:快速搭建数据库操作框架 + 增删改查(CRUD)
  • 华为云Flexus+DeepSeek征文|依托华为云生态:Dify 平台 AI Agent 开发的场景化实践
  • .gitignore 的基本用法
  • Linux:五种IO模型
  • 【MySQL】分组查询、聚合查询、联合查询
  • 第三章 第二大脑的运作机理 整理笔记
  • Ethan的日记5/25
  • 【电子通识】连接器的绝缘胶座和接触端子基础知识
  • 图片批量压缩转换格式 JPG/PNG无损画质 本地运行
  • 华为OD机试真题——启动多任务排序(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • Javase 基础加强 —— 09 IO流第二弹
  • 05. C#入门系列【类、结构、枚举】:从青铜到王者的进阶之路
  • 什么是maven(详细介绍)
  • 并发编程艺术--AQS底层源码解析(二)
  • 在train和eval模式下性能差距的问题(本文聚焦于BatchNorm2d)
  • TensorRT----RepVGG模型推理与部署
  • 解决leensa无法连接的问题:平替教程
  • 【PhysUnits】12 加法操作(add.rs)