华为OD机试真题目录点击查看: 华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解
华为OD机试2025B卷 100分题型
真题目录: 点击去查看
2025A卷 100分题型
给定一个二叉树,每个节点上站一个人,节点[数字表示]父节点到该节点传递悄悄话需要花费的时间。
初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。
给定二叉树
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
返回所有节点都接收到悄悄话花费的时间
38
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
38
思路:DFS
从根节点到 叶子节点的最大路径和
。i
,左子节点的索引为2 * (i + 1) -1
, 右节点的索引为2 * (i +1 )
.DFS
遍历根节点到所有叶子节点(没有子节点的节点)的路径和,其中最大的和就是结果。#include
#include
#include
#include
#include
#include
using namespace std;
// 存储最大时间
int res = 0;
// 深度遍历
void dfs(int value, vector<int> tree, int pos) {
int tmp = value + tree[pos];
int left = 2 * (pos + 1) - 1;
int right = 2 * (pos + 1);
// 已经到达叶子节点,更新最大值
if ((left >= tree.size() || tree[left] == -1) && (right >= tree.size() || tree[right] == -1)) {
res = max(res, tmp);
return;
}
if (!(left >= tree.size() || tree[left] == -1)) {
dfs(tmp, tree, left);
}
if (!(right >= tree.size() || tree[right] == -1)) {
dfs(tmp, tree, right);
}
}
int main() {
vector<int> tree;
int tmp;
while (cin >> tmp) {
tree.push_back(tmp);
}
if (tree.size() == 0) {
cout << res;
return 0;
}
dfs(0, tree, 0);
cout << res;
return 0;
}
import java.util.*;
public class Main {
// 存储最大时间
static int res = 0;
// 深度优先搜索(DFS)
static void dfs(int value, List<Integer> tree, int pos) {
int tmp = value + tree.get(pos);
int left = 2 * (pos + 1) - 1;
int right = 2 * (pos + 1);
// 已到达叶子节点,更新最大值
if ((left >= tree.size() || tree.get(left) == -1) && (right >= tree.size() || tree.get(right) == -1)) {
res = Math.max(res, tmp);
return;
}
if (left < tree.size() && tree.get(left) != -1) {
dfs(tmp, tree, left);
}
if (right < tree.size() && tree.get(right) != -1) {
dfs(tmp, tree, right);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Integer> tree = new ArrayList<>();
while (scanner.hasNextInt()) {
tree.add(scanner.nextInt());
}
scanner.close();
if (tree.isEmpty()) {
System.out.println(res);
return;
}
dfs(0, tree, 0);
System.out.println(res);
}
}
import sys
# 存储最大时间
res = 0
# 深度优先搜索(DFS)
def dfs(value, tree, pos):
global res
tmp = value + tree[pos]
left = 2 * (pos + 1) - 1
right = 2 * (pos + 1)
# 已到达叶子节点,更新最大值
if (left >= len(tree) or tree[left] == -1) and (right >= len(tree) or tree[right] == -1):
res = max(res, tmp)
return
if left < len(tree) and tree[left] != -1:
dfs(tmp, tree, left)
if right < len(tree) and tree[right] != -1:
dfs(tmp, tree, right)
# 读取输入
tree = list(map(int, sys.stdin.read().split()))
if not tree:
print(res)
else:
dfs(0, tree, 0)
print(res)
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let tree = [];
// 最大时间
let res = 0;
// 深度优先搜索(DFS)
function dfs(value, tree, pos) {
let tmp = value + tree[pos];
let left = 2 * (pos + 1) - 1;
let right = 2 * (pos + 1);
// 叶子节点
if ((left >= tree.length || tree[left] === -1) && (right >= tree.length || tree[right] === -1)) {
res = Math.max(res, tmp);
return;
}
if (left < tree.length && tree[left] !== -1) {
dfs(tmp, tree, left);
}
if (right < tree.length && tree[right] !== -1) {
dfs(tmp, tree, right);
}
}
// 读取输入
rl.on("line", (input) => {
tree = input.split(" ").map(Number);
if (tree.length === 0) {
console.log(res);
} else {
dfs(0, tree, 0);
console.log(res);
}
rl.close();
});
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// 最大时间
var res int
// 深度优先搜索(DFS)
func dfs(value int, tree []int, pos int) {
tmp := value + tree[pos]
left := 2*(pos+1) - 1
right := 2 * (pos + 1)
// 已到达叶子节点,更新最大值
if (left >= len(tree) || tree[left] == -1) && (right >= len(tree) || tree[right] == -1) {
if tmp > res {
res = tmp
}
return
}
if left < len(tree) && tree[left] != -1 {
dfs(tmp, tree, left)
}
if right < len(tree) && tree[right] != -1 {
dfs(tmp, tree, right)
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
input := scanner.Text()
// 解析输入
parts := strings.Fields(input)
tree := make([]int, len(parts))
for i, s := range parts {
tree[i], _ = strconv.Atoi(s)
}
if len(tree) == 0 {
fmt.Println(res)
return
}
dfs(0, tree, 0)
fmt.Println(res)
}