L2-006 树的遍历(Java)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

解题思路

解决这个问题,我们首先需要理解二叉树的后序遍历、中序遍历以及层序遍历的基本概念:

  • 后序遍历:首先访问左子树,然后访问右子树,最后访问根节点。
  • 中序遍历:首先访问左子树,然后访问根节点,最后访问右子树。
  • 层序遍历:按照树的层次从上到下、从左到右进行访问。

要根据给定的后序遍历和中序遍历结果重建二叉树,然后进行层序遍历。这个过程可以分为两个步骤:

步骤一:重建二叉树
  1. 后序遍历的最后一个元素为树的根节点。利用这一点,我们可以在中序遍历的序列中找到根节点的位置,从而确定左右子树的中序遍历序列。
  2. 在中序遍历序列中,根节点左边的为左子树,右边的为右子树。根据左、右子树的节点数量,我们可以在后序遍历的序列中分别找到左右子树的后序遍历序列。

【补充:

当我们找到根节点在中序遍历数组中的位置index后:

  • 左子树的中序遍历结果是inorder数组中从inStartindex-1的部分。
  • 右子树的中序遍历结果是inorder数组中从index+1inEnd的部分。

对于后序遍历数组:

  • 左子树的后序遍历结果是postorder数组中从postStart到某个位置的部分。这个“某个位置”需要根据中序遍历结果来确定,具体是postStart + index - inStart - 1。这是因为左子树的元素数量正好等于index - inStart,即中序遍历中根节点左侧元素的数量。
  • 右子树的后序遍历结果是postorder数组中从postStart + index - inStartpostEnd-1的部分。

  1. 重复上述过程,对左右子树分别递归执行,直到所有的节点都被处理。
步骤二:层序遍历重建后的二叉树
  • 使用队列进行层序遍历。首先将根节点加入队列,然后:
    1. 从队列中取出一个节点。
    2. 访问该节点。
    3. 如果左子节点存在,将左子节点加入队列。
    4. 如果右子节点存在,将右子节点加入队列。
    5. 重复步骤1-4,直到队列为空。

解题代码

import java.io.BufferedReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}// 重建二叉树public static TreeNode buildTree(int[] inorder, int[] postorder) {if (inorder == null || postorder == null || inorder.length != postorder.length) {return null;}return build(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);}private static TreeNode build(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {if (postStart > postEnd) {return null;}TreeNode root = new TreeNode(postorder[postEnd]);int index = inStart;while (index <= inEnd && inorder[index] != postorder[postEnd]) {index++;}root.left = build(inorder, inStart, index - 1, postorder, postStart, postStart + index - inStart - 1);root.right = build(inorder, index + 1, inEnd, postorder, postStart + index - inStart, postEnd - 1);return root;}// 层序遍历public static void levelOrder(TreeNode root) {if (root == null) {return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);boolean isFirst = true; // 添加标志变量while (!queue.isEmpty()) {TreeNode node = queue.poll();if (isFirst) {System.out.print(node.val);isFirst = false;} else {System.out.print(" " + node.val); // 在每个数字前添加空格}if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 假设这些值是通过输入获取的int N = scanner.nextInt();int[] postorder = new int[N];int[] inorder = new int[N];for (int i = 0; i < N; i++) {postorder[i] = scanner.nextInt();}for (int i = 0; i < N; i++) {inorder[i] = scanner.nextInt();}TreeNode root = buildTree(inorder, postorder);levelOrder(root);}
}

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

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

相关文章

使用OCC进行阵列操作

OCC中实现阵列操作&#xff0c;本质上计算出物体的位置&#xff0c;然后进行位置变换&#xff0c;复制出一个新的物体的过程&#xff0c;下列用直线的阵列和环形的阵列作为例子&#xff1a; 直线阵列&#xff1a;以一个在z轴正方向的直线向y轴方向阵列2个距离为5的对象 #inclu…

hcia datacom课程学习(2):telnet与ssh

telnetssh所属层应用层应用层所应用的传输层协议tcptcp功能远程连接远程连接默认端口2322安全性很低较高功能组件分布客户端、服务器端客户端、服务器端linux环境不自带自带windows环境 win7有客户端和服务器端&#xff0c;但需要手动打开。 win10只有客户端&#xff0c;也需要…

Winform程序中UI更新延迟

在 WinForm 中&#xff0c;UI 更新通常是在 UI 线程上进行的&#xff0c;如果你在 UI 线程之外的地方修改了 UI 元素&#xff0c;可能会导致更新有延迟&#xff0c;单纯的使用delegate也不能及时的更新UI。经实践&#xff0c;最终实现方案如下&#xff1a; this.Invoke((Method…

基于STM32G031LORA开发板的时间同步项目

一、前言 本项目采用淘宝购买的STM32G031开发板&#xff0c;板上预留了oled和LORA模块的IO&#xff0c;一次性买了四套&#xff0c;资料虽然质量不高&#xff0c;但是覆盖面挺广&#xff0c;有一定的学习价值。 实验目的是需要三个从机实现时间轴的一致&#xff0c;考虑到现有环…

分词组合加密实现加密后可模糊查询

分词组合加密实现加密后可模糊查询 之前有次遇到一个数据库敏感字段脱敏的需求&#xff0c; 使用mybaits对数据库内的敏感字段进行加解密&#xff0c; 但是在加密储存之后&#xff0c;业务上但凡涉及到加密的字段都没办法进行模糊搜索 Mybatis插件对指定字段加解密 最近要实现…

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档&#xff0c;基于API9。

期货开户市场的风险在哪里?

期货市场的风险在哪里&#xff1f;强平和穿仓是什么&#xff1f; 期货市场是一个自带杠杆的市场&#xff0c;简单理解就是我们只需要用10W就能买到价值100万的商品。期货主要的风险来源于仓位风险和交割风险&#xff0c;仓位风险就是我们是采用满仓还是轻仓方式交易。比如我们…

html5cssjs代码 003 50以内的乘法算式

html5&css&js代码 003 50以内的乘法算式 一、代码二、解释 综合应用代码示例。50以内的乘法算式。 一、代码 <!DOCTYPE html> <html lang"en"> <head><title>20以内的乘法</title><meta charset"UTF-8"><…

【和谐身心】植物神经紊乱?调整心态,重拾生活平衡!

在快节奏的现代生活中&#xff0c;许多人可能会遭遇植物神经紊乱的困扰&#xff0c;表现为焦虑、失眠、心悸等症状&#xff0c;严重影响生活质量。但请记住&#xff0c;您并不孤单&#xff0c;让我们一起探索如何调整心态&#xff0c;缓解这些不适&#xff0c;恢复身心和谐。 植…

32个关键字详解①(C语言)

目录 关键字分类&#xff1a; 第一个C程序 - 补充内容 变量的定义与声明 - 补充内容 变量的分类 - 补充内容 变量的作用域 - 补充内容 变量的生命周期 - 补充内容 auto 关键字 register 关键字 static 关键字 static 修饰变量&#xff1a; static修饰函数 sizeof 关键字 基本数…

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

全排列+力扣

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution {vector<vector<int>> ret;vector<int> path;bool used[7]; public:vector<vector<int>> permute(vector<int>& nums) {_permute(nums…

C++_包装器

目录 1、包装器的用法 2、包装器的类型 3、包装器的作用 4、包装成员函数 5、bind&#xff08;绑定&#xff09; 5.1 bind的用法 5.2 bind减少参数个数 结语 前言&#xff1a; C11的包装器&#xff0c;总称为function包装器&#xff0c;而包装器又称适配器…

allegro PCB设计心得笔记(二) -- ERROR(SPMHUT-144): Illegal arc specification

使用Allegro PCB Editor设计PCB&#xff0c;其中使用了中文丝印&#xff0c;设计完成后&#xff0c;进行Tools -> Database Check&#xff0c;提示如下错误&#xff1a; 对PCB文件进行反复检查&#xff0c;也没有找到具体问题&#xff0c;但是删除中文丝印封装后&#xff0c…

vue3 uniapp 项目初始化集成配置【开箱即用】

https://gitee.com/charrie/vue3-uniapp-init 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低代码体积全局请求入口已封装&#xff0c;使用时自己封…

宝塔面板配置网站通过ip地址+端口,页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。

宝塔面板配置网站通过ip地址端口&#xff0c;页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。 一般来说vue项目build打包以后 如果 直接发布服务器 并且不使用后端接口。 是不需要配置nginx的。 假设我vue部署好了。我的ip是106.66.66.66. 但是我页面里面…

PLC数据采集网关是如何应用的?-天拓四方

PLC数据采集网关通过以太网、串口等通信接口与PLC设备连接&#xff0c;实现数据的实时采集。网关内置数据处理模块&#xff0c;可以对采集到的数据进行清洗、转换和存储&#xff0c;以满足不同应用场景的需求。同时&#xff0c;PLC数据采集网关支持多种通信协议&#xff0c;如M…

2.2 关系操作

目录 2.2.1 基本的关系操作 常用的关系操作 关系操作的特点 2.2.2 关系数据语言的分类 关系代数语言&#xff1a; 关系演算语言&#xff1a; 元组关系演算语言 域关系演算语言 2.2.1 基本的关系操作 常用的关系操作 查询操作&#xff1a;选择、投影、连接、除、并、差…

1.Spring核心功能梳理

概述 本篇旨在整体的梳理一下Spring的核心功能,让我们对Spring的整体印象更加具体深刻,为接下来的Spring学习打下基础。 本片主体内容如下: Bean的生命周期依赖注入的实现Bean初始化原理推断构造方法原理AOP的实现这里要说明一下,我们这里说到的Spring,一般指的是Spring F…

Linux软件高级编程-网络--TCP通信--day14

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次收到的确…