Acwing---1497. 树的遍历

树的遍历

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

一个二叉树,树中每个节点的权值互不相同。

现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。

输入格式
第一行包含整数 N,表示二叉树的节点数。

第二行包含 N个整数,表示二叉树的后序遍历。

第三行包含 N 个整数,表示二叉树的中序遍历。

输出格式
输出一行 N
个整数,表示二叉树的层序遍历。

数据范围
1≤N≤30,

官方并未给出各节点权值的取值范围,为方便起见,在本网站范围为 1∼N。

输入样例1:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例1:

4 1 6 3 5 7 2

2.基本思想

思路:

  • 先根据后序和中序遍历结果构造二叉树

  • 按层次遍历构造出来的二叉树

第一步:构造二叉树

  • 存储结构使用两个哈希表:leftChile, rightChile。leftChile[i] = j: i 的左儿子是j,rightChilet同理

  • 后序遍历的最后一个节点是跟节点,得到根节点后,递归构造根节点的左儿子和右儿子。

  • 返回二叉树的根节点

  • 也可以选择其他方式构造二叉树。

在这里插入图片描述
第二步:遍历二叉树

按层次遍历二叉树,使用bfs

  1. 根节点入队列。

  2. 当队列非空,队头的左右儿子入队列,队头出队。

在这里插入图片描述

3.代码实现


import java.util.*;

public class Main {
    static int N = 40;
    static int[] postorder = new int[N], inorder = new int[N];//后序 中序
    static HashMap<Integer, Integer> pos = new HashMap<>();
    static HashMap<Integer, Integer> l = new HashMap<>();// l<根节点的值,左子树根节点的值>
    static HashMap<Integer, Integer> r = new HashMap<>();// r<根节点的值,右子树根节点的值>

    private static int build(int il, int ir, int pl, int pr) {//中序 左右 后续 左右
        int root = postorder[pr];//根节点 一定是 后序遍历 最后一个
        int k = pos.get(root);// 获取根节点在中序遍历的下标

        if (il < k) {// 根 k 有左子树
            //il ~ k-1 是 左子树的所有节点,长度为 len = (k-1-il)
            //	pl ~ pl+len: 是后序遍历序列里边左子树的范围
            int lroot = build(il, k - 1, pl, pl + k - 1 - il);
            l.put(root, lroot);
        }
        if (ir > k) {// 根 k 有右子树
            int rroot = build(k + 1, ir, pl + k - 1 - il + 1, pr - 1);
            r.put(root, rroot);// root 的右子树的根节点是 rroot
        }
        return root;
    }

    private static void bfs(int root) {
        Queue<Integer> q = new LinkedList();
        q.add(root);
        while (!q.isEmpty()) {
            int t = q.poll();
            System.out.print(t + " ");
            //			如果此节点有左子树,入队
            if (l.containsKey(t)) q.add(l.get(t));
            //			如果此节点有右子树,入队
            if (r.containsKey(t)) q.add(r.get(t));
        }
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) postorder[i] = sc.nextInt();//读入 后序遍历数组
        for (int i = 0; i < n; i++) {//读入中序遍历
            inorder[i] = sc.nextInt();
            pos.put(inorder[i], i);// 记录中序遍历每个点的下标
        }
        int root = build(0, n - 1, 0, n - 1);//中序  后续
        bfs(root);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javase-类与对象

文章目录 一 . 面向过程的初步认知二 . 如何创建一个类三 . 如何创建一个对象四 . this引用五 . 构造方法六 . 初始化 一 . 面向过程的初步认知 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对…

使用Android Native Hook技术解决VLC播放器闪退的问题

文章目录 1.概述2.问题描述3.问题分析4.问题解决5.总结 1.概述 在做公司的一个TOB的需求时&#xff0c;发现调起Unity提供的3D播放器播放网络在线视频时闪退了&#xff0c;然后就拉着相关部门的人一起分析问题&#xff0c;最后定位到是VLC里面用到的系统日志打印函数在部分的系…

Flask入门二(Flask的CBV、模版语法、请求和响应、session执行流程分析、Flask闪现、请求拓展、g对象)

文章目录 一、Flask的CBV1.CBV的写法2.CBV的执行流程3.endpoint 的使用4.CBV中得methods作用5.CBV加装饰器 二、模版语法1.渲染变量2.变量的循环3.逻辑判断 三、请求和响应四、session执行流程分析1.基本使用2.执行流程3.Django中session的执行流程 五、Flask闪现1.作用2.案例3…

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候&#xff0c;有时候会使用一些辅助工具。 Node.js就是开发中&#xff0c;经常会遇到的一款软件。 1.下载Node.js 下载地址&#xff1a;https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上&#xff0c;继续点击…

【论文精读】I-JEPA

摘要 计算机视觉中&#xff0c;常采用基于不变性和基于生成的方法进行自监督学习。对比学习&#xff08;CL&#xff09;是典型的基于不变性的方法&#xff0c;通过预训练方法优化编码器&#xff0c;使其能生成同一图像的两个或多个视图的相似嵌入&#xff0c;其中图像视图通常由…

格两例12345

osu/Lucky Roll gaming 周末osu有道题&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

关于python函数参数传递

参数传递 在 python 中&#xff0c;类型属于对象&#xff0c;对象有不同类型的区分&#xff0c;变量是没有类型的&#xff1a; 在下面的代码示例重&#xff0c;[1,2,3] 是 List 类型&#xff0c;“qayrup” 是 String 类型&#xff0c;而变量 a 是没有类型&#xff0c;它仅仅…

java找工作之Mybatis(入门及xml配置相关)

Mybatis 学习Mybatis就要学会查看官网&#xff0c;官网地址如下&#xff1a;<MyBatis中文网 > 1、简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取…

图形系统开发实战课程:进阶篇(上)——9.空间算法(一)

图形开发学院&#xff5c;GraphAnyWhere 课程名称&#xff1a;图形系统开发实战课程&#xff1a;进阶篇(上)课程章节&#xff1a;“图形样式”原文地址&#xff1a;https://www.graphanywhere.com/graph/advanced/2-9.html 第九章 空间算法&#xff08;一&#xff09; \quad 在…

计算机专业必看的十部电影

计算机专业必看的十部电影 1. 人工智能2. 黑客帝国3. 盗梦空间4. 社交网络5. Her6. 模仿游戏7. 斯诺登8. 头号玩家9. 暗网10. 网络迷踪 计算机专业必看的十部电影&#xff0c;就像一场精彩盛宴&#xff01; 《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力《模仿游戏…

小红关鸡(双指针)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 有nnn个鸡窝排成一排&a…

#WEB前端(CCS常用属性,补充span、div)

1.实验&#xff1a; 复合元素、行内元素、块内元素、行内块元素 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; span为行内元素&#xff1a;不可设置宽高&#xff0c;实际占用控件决定分布空间。 div为块内元素&#xff1a;占满整行&#xff0c;可以设置宽高 img为行内块元…

Windows 2012 设置 nginx 开机自启动(适用于windows2012/10)

Windows 2012 设置 nginx 开机自启动&#xff08;适用于windows2012/10&#xff09;https://www.cnblogs.com/xuegqcto/articles/7521483.html 在windows server 2012上安装nginx&#xff0c;同时配置开机自启动服务&#xff08;推荐使用“Windows Service Wrapper”工具&…

前后端分离项目服务器部署

文章目录 前言准备工作安装jdk1.8安装nginx安装库解压、编译nginx并安装nginx 命令测试nginx 安装mysql卸载mariadb用root用户登录系统&#xff0c;增加mysql用户和组准备数据目录初始化MySQL将mysql加入到服务中编辑配置文件&#xff0c;保存退出启动mysql配置环境变量设置开机…

20 个不同的 Python 函数实例

Python 是一种广泛使用的高级编程语言&#xff0c;其函数是 Python 编程中至关重要的概念之一。函数是一段可以重复使用的代码块&#xff0c;可以接收输入参数并返回输出结果。使用函数能够提高代码的可读性、可维护性和重用性。 基础知识 在 Python 中&#xff0c;函数使用关…

C语言初阶—数组

数组是一组相同类型元素的集合。 在C99标准之前&#xff0c;数组的大小必须是常量或常量表达式。 在C99标准之后&#xff0c;数组的大小可以是变量&#xff0c;可以支持变长数组&#xff0c;但变长数组不能初始化。 不完全初始化&#xff0c;剩余的元素默认初始化为0 。 数组访…

c++_leetcode_寻找峰值

目录 一、寻找峰值的示例 二、官方实现代码及解释 1、官方测试结果&#xff1a; 2、代码解释&#xff1a; 3、解题思路&#xff1a; 三、我的暴力解决 1、测试一&#xff1a; 2、测试二&#xff1a; 3、最终“暴力求解”代码&#xff1a; 4、官网提交测试通过&#xf…

终极排序(快排,归并,库函数)

一、快速排序 1、确定分界点&#xff1a;q [ l ] , q [ ( l r ) / 2 ] , q [ r ] ,或者其它区间之中的随机数。&#xff08;左 l 右 r &#xff09; 2、调整区间&#xff1a;&#xff08;较难理解的部分&#xff09; &#xff08;1&#xff09;、暴力做法 …

基于Siamese网络的zero-shot意图分类

原文地址&#xff1a;Zero-Shot Intent Classification with Siamese Networks 通过零样本意图分类有效定位域外意图 2021 年 9 月 24 日 意图识别是面向目标对话系统的一项重要任务。意图识别(有时也称为意图检测)是使用标签对每个用户话语进行分类的任务&#xff0c;该标签…

云手机的境外舆情监控应用——助力品牌公关

在当今数字化时代&#xff0c;社交媒体已成为品牌传播和互动的主要平台。随之而来的是海量的信息涌入&#xff0c;品牌需要及时了解并应对海外社交媒体上的舆情变化。本文将介绍如何通过云手机进行境外舆情监控&#xff0c;更好地帮助企业公关及时作出决策。 1. 境外舆情监控与…