二叉树计算 - 华为OD统一考试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

给出一个二叉树如下图所示:
6
/ \
7 9
\ /
-2 6

请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。

​ 20(7-2+9+6)
​ / \
​ -2 6
​ \ /

​ 0 0

左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树

输入描述

2行整数,第1行表示二叉树的中序遍历,第2行表示二叉树的前序遍历,以空格分割

例如:

7 -2 6 6 9
6 7 -2 9 6

输出描述

1行整数,表示求和树的中序遍历,以空格分割

例如:

输出1
-2 0 20 0 6

示例1

输入:
-3 12 6 8 9 -10 -7
8 12 -3 6 -10 9 -7输出:
0 3 0 7 0 2 0

题解

递归的题目

根据树的中序和先序遍历可以唯一确定一颗树,题解中将中序和先序字符串看成一个整体(树)。

题目求的是求和树的中序遍历, 因此还是使用递归中序遍历的方式去遍历树,遍历的同时去求 左右子树和(即为答案)。

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;/*** @author code5bug*/
public class Main {static List<Integer> rs = new ArrayList<>();public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 中序遍历List<Integer> inorder = Arrays.stream(scanner.nextLine().split(" ")).map(p -> Integer.parseInt(p)).collect(Collectors.toList());// 先序遍历List<Integer> preorder = Arrays.stream(scanner.nextLine().split(" ")).map(p -> Integer.parseInt(p)).collect(Collectors.toList());solve(inorder, preorder);for (int num : rs) {System.out.print(num + " ");}}static void solve(List<Integer> inorder, List<Integer> preorder) {if (inorder.isEmpty() || preorder.isEmpty()) {return;}// 数根节点的值int rootVal = preorder.get(0);int idx = inorder.indexOf(rootVal);// 中序,左右子树List<Integer> leftInorder = inorder.subList(0, idx);List<Integer> rightInorder = inorder.subList(idx + 1, inorder.size());// 先序,左右子树List<Integer> leftPreorder = preorder.subList(1, idx + 1);List<Integer> rightPreorder = preorder.subList(idx + 1, preorder.size());solve(leftInorder, leftPreorder);// 左右子树求值求和int leftSum = leftInorder.stream().reduce(0, Integer::sum);int rightSum = rightInorder.stream().reduce(0, Integer::sum);rs.add(leftSum + rightSum);solve(rightInorder, rightPreorder);}}

Python

# 以下 2 行代码解决递归深度报错只能 AC 95% 的问题
import sys
sys.setrecursionlimit(10000)# 中序遍历
inorder = list(map(int, input().split()))
# 先序遍历
preorder = list(map(int, input().split()))# 求和树的中序遍历
rs = []def solve(inorder, preorder):if not inorder or not preorder:returnroot_val = preorder[0]idx = inorder.index(root_val)left_inorder = inorder[: idx]right_inorder = inorder[idx + 1:]left_preorder = preorder[1: idx + 1]right_preorder = preorder[idx + 1:]solve(left_inorder, left_preorder)rs.append(sum(left_inorder) + sum(right_inorder))solve(right_inorder, right_preorder)solve(inorder, preorder)
print(*rs)

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>using namespace std;vector<int> rs;void solve(vector<int>& inorder, vector<int>& preorder) {if (inorder.empty() || preorder.empty()) {return;}// 数根节点的值int rootVal = preorder[0];auto it = find(inorder.begin(), inorder.end(), rootVal);int idx = distance(inorder.begin(), it);// 中序,左右子树vector<int> leftInorder(inorder.begin(), inorder.begin() + idx);vector<int> rightInorder(inorder.begin() + idx + 1, inorder.end());// 先序,左右子树vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + idx + 1);vector<int> rightPreorder(preorder.begin() + idx + 1, preorder.end());solve(leftInorder, leftPreorder);// 左右子树求值求和int leftSum = accumulate(leftInorder.begin(), leftInorder.end(), 0);int rightSum = accumulate(rightInorder.begin(), rightInorder.end(), 0);rs.push_back(leftSum + rightSum);solve(rightInorder, rightPreorder);
}vector<int> read_line(vector<int>& collect) {int v;while (cin >> v) {collect.push_back(v);if (cin.peek() == '\n') break;}return collect;
}int main() {// 中序遍历vector<int> inorder;read_line(inorder);// 先序遍历vector<int> preorder;read_line(preorder);solve(inorder, preorder);for (int num : rs) {cout << num << " ";}return 0;
}

相关练习题

题号题目难易
LeetCode 105105. 从前序与中序遍历序列构造二叉树中等
LeetCode 106106. 从中序与后序遍历序列构造二叉树中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建全面有效的监控运维考核评分标准体系

在现代企业的IT运维管理中&#xff0c;监控运维考核评分标准体系不仅是衡量运维团队工作效果的重要工具&#xff0c;更是推动企业IT服务持续改进和优化的关键所在。一个完善、合理的考核评分标准体系能够客观地反映运维团队的实际工作表现&#xff0c;为管理层提供决策支持&…

30岁以就业为目标学前端,快歇着吧;反之50岁都不晚。

Hi&#xff0c;我是贝格前端工场&#xff0c;首先声明声明我们不搞前端培训&#xff0c;有很多老铁在留言中问我关于前端学习的问题&#xff0c;最普遍的一个问题就是30岁以后学前端晚了吗&#xff1f;今天借着此篇文章回答一下。 一、30岁学前端的三种人 首先抛开年龄不说&am…

macbook air(M1 2020)安装graphviz和python pip或conda 安装pygraphviz

第一步,先用Homebrew转graphviz包 brew install graphviz 能够在以下路径中找到graphviz文件:(/opt/homebrew/Cellar/graphviz) 第二步. 安装pygraphviz时提供搜索路径 pip3 install --global-optionbuild_ext --global-option"-I$(brew --prefix graphviz)/include"…

【EI会议征稿通知】第三届能源、电力与电气国际学术会议(ICEPET 2024)

第三届能源、电力与电气国际学术会议&#xff08;ICEPET 2024&#xff09; 2024 3rd International Conference on Energy, Power and Electrical Technology 第三届能源、电力与电气国际学术会议&#xff08;ICEPET 2024&#xff09;由西华大学主办&#xff0c;西华大学能源…

C语言系列-浮点数在内存中的存储

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 浮点数在内存中的存储 浮点数的存储 浮点数存的过程 浮点数取的过程 题目解析 浮点数在内存中的存储 常见的浮点数&#xff1a;3.14159.1E10等&#xff0c;浮点数家族包括&…

【HDFS】一天一个RPC系列--updateBlockForPipeline

本文目标是: 弄清updateBlockForPipeline这个RPC的作用。弄清updateBlockForPipeline RPC的使用场景,代码里的调用点。一、updateBlockForPipeline的作用 其定义在ClientProtocol接口里,是Client与NameNode之间的接口。 看其代码注释描述: 为一个under construction状态下…

前端JavaScript篇之什么是 JavaScript 包装类型?将包装类型转换为基本类型的方法

目录 什么是 JavaScript 包装类型&#xff1f;将包装类型转换为基本类型的方法什么是 JavaScript 包装类型&#xff1f;包装类型的作用字符串包装类型数字包装类型布尔包装类型总结 将包装类型转换为基本类型的方法总结 什么是 JavaScript 包装类型&#xff1f;将包装类型转换为…

Java中的四种线程池详解及使用场景

前言 在Java并发编程中&#xff0c;JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法&#xff0c;这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…

Linux文本三剑客---grep

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…

react 什么是h函数

React 中的 H 函数&#xff0c;通常是指 Hooks&#xff08;钩子&#xff09;函数。Hooks 是 React 16.8 版本引入的新特性&#xff0c;允许你在不写 class 的情况下使用 state 以及其他的 React 特性。Hooks 提供了一种更简洁、更直观的方式来使用 React 的功能&#xff0c;使得…

11.2 Web开发_CSS入门(❤❤)

11.2 Web开发_CSS入门❤❤ 1. CSS简介1.1 基础案例2. CSS书写的位置2.1 行内式2.2 内嵌式2.3 外链式3. CSS基础选择器3.1 标签选择器3.2 id选择器3.3 类选择器3.4 选择器优先级3.5 通配符选择器4. 多类名5. 样式的两种特性5.1 层叠性

仰暮计划|“老师说我其实很聪明,就是家里太穷了没条件,不然我现在也是……”

吴桂荣老人回忆录 在我外婆家的时候&#xff0c;我跟几位老奶奶坐在门口一起聊天&#xff0c;我询问她们是否能帮助我完成一份作业&#xff0c;她们笑着答应了&#xff0c;最后我选择了其中的一位老奶奶作为了解对象&#xff0c;她邀请我去家中交谈。通过了解&#xff0c;我得知…

HCIA学习第四天:静态路由与动态路由

静态路由&#xff1a; 选路原则&#xff1a;尽量选择路径最短的路由条目 扩展配置&#xff1a; 1、负载均衡&#xff1a;当路由器访问同一个目标且目标且目标具有多条开销相似的路径时&#xff0c;可以让设备将流量拆分后延多条路径同时进行传输&#xff0c;以达到叠加带宽的…

(七)springboot实战——springboot3集成R2DBC实现webflux响应式编程服务案例

前言 本节主要内容是关于使用新版springboot3集成响应式数据库R2DBC,完成响应式web服务案例。需要注意的是&#xff0c;此次项目使用的JDK版本是JDK17&#xff0c;springboot版本使用3.2.2版本&#xff0c;数据库使用关系型数据库mysql。WebFlux 是一个基于响应式编程模型的框…

K8s-持久化(持久卷,卷申明,StorageClass,StatefulSet持久化)

POD 卷挂载 apiVersion: v1 kind: Pod metadata:name: random-number spec:containers:- image: alpinename: alpinecommand: ["/bin/sh","-c"]args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]volumeMounts:- mountPath: /optname: da…

04-Nacos-服务注册基于spring boot实现

官方参考 在不依赖spring cloud 组件基础上&#xff0c;单独的微服务项目&#xff0c;实现nacos接入 1、依赖文件pom.xml <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><…

RUST笔记: 动态链接库的创建和使用

生成动态链接库 // https://github.com/vvvm23/funny-shapes # 项目元信息 [package] name "funnyshapes" # 项目名称 version "0.1.0" # 版本号 edition "2021" # Rust语言版本# 更多配置信息可查阅&#xff1…

华为机考入门python3--(3)牛客3-明明的随机数

分类&#xff1a;集合、排序 知识点&#xff1a; 集合添加元素 set.add(element) 集合转列表 list(set) 列表排序 list.sort() 题目来自【牛客】 N int(input().strip()) nums set()for i in range(N):nums.add(int(input().strip()))# 集合转列表 nums_list l…

眼底增强型疾病感知蒸馏模型 FDDM:无需配对,fundus 指导 OCT 分类

眼底增强型疾病感知蒸馏模型 FDDM&#xff1a;fundus 指导 OCT 分类 核心思想设计思路训练和推理 效果总结子问题: 疾病特定特征的提取与蒸馏子问题: 类间关系的理解与建模 核心思想 论文&#xff1a;https://arxiv.org/pdf/2308.00291.pdf 代码&#xff1a;https://github.c…

【模板】拓扑排序

Problem: 【模板】拓扑排序 文章目录 思路解题方法复杂度Code 思路 拓扑排序模板 解题方法 初始化一个队列&#xff0c;将所有入度为0的顶点入队。从队列中取出一个顶点&#xff0c;并将其输出。对于该顶点的所有出边&#xff0c;将出边的终点的入度减1。如果某个顶点的入度变为…