树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)

2023-11-04

题目如下:

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

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

输入格式

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

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

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

输出格式

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

数据范围

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

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

 中序遍历:遵循规则左根右(1,2,3,4,5,6,7)

后序遍历:遵循规则左右根(2,3,1,5,7,6,4)

如题,它的树长这样:

可以得知,后序遍历最后一个位置即为该树的根结点,找到中序遍历中根结点位置,即可判断出左子树与右子树结点个数,即 4 为根结点值,在中序遍历中其前面与后面各有 3 个节点,因此     1,2,3为左子树各结点值,5,6,7为右结点各结点值,再递归到左子树与右子树重复该操作,即可得到该树的结构

代码如下:

        

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int N = 35;

//定义树结构
typedef struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int value) : val(value), left(nullptr), right(nullptr) {} //构造函数
}TreeNode;

//建立树结构
TreeNode* BuildTree(vector<int>& postorder, vector<int>& inorder, int postEnd, int inStart, int inEnd) {
    if(postEnd <= 0 || inStart >= inEnd)
        return nullptr;
    
    //找到根节点,并开辟空间
    int rootval = postorder[postEnd];
    TreeNode* root = new TreeNode(rootval);
    
    //找到该根节点在中序遍历中的位置
    int rootIndexInInOrder = 0;
    for(rootIndexInInOrder = inStart; rootIndexInInOrder <= inEnd; rootIndexInInOrder++){
        if(inorder[rootIndexInInOrder] == rootval){
            break;
        }
    }
    
    //计算出右子树个数
    int rightTreeSize = inEnd - rootIndexInInOrder;
    
    //递归左右子树
    root->right = BuildTree(postorder, inorder, postEnd - 1, rootIndexInInOrder + 1, inEnd);

    root->left = BuildTree(postorder, inorder, postEnd - 1 - rightTreeSize, inStart, rootIndexInInOrder - 1);
    
    return  root;
}


//树的层序遍历
vector<int> GetLevelOrderVal(TreeNode* root){
    vector<int> res;
    
    if(!root)    return res;
    
    queue<TreeNode*> q;
    q.push(root);
    
    while(!q.empty()){
        auto node = q.front();
        q.pop();
        res.push_back(node->val);
        
        if(node->left)      q.push(node->left);
        if(node->right)     q.push(node->right);
    }
    
    return res;
}

int main(){
    vector<int> postorder(N);
    vector<int> inorder(N);
    
    int n = 0;
    cin >> n;
    
    for(int i = 0; i < n; i++)      cin >> postorder[i];
    for(int i = 0; i < n; i++)      cin >> inorder[i];
    
    TreeNode* root = BuildTree(postorder, inorder, n - 1, 0, n - 1);
    
    vector<int> res = GetLevelOrderVal(root);
    
    for(auto& val : res)
        cout << val << " ";
    cout << endl;
        
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储) 的相关文章

随机推荐

  • ntp服务器修改时区,部署ntp服务器笔记与时区的介绍与修改

    准备工作 server ip 10 1 1 119 client ip 10 1 1 56 关闭selinux vi etc selinux config SELINUX disabled 关闭iptables service iptabl
  • 时序分析基本概念介绍——SDC概述

    今天我们要介绍的时序概念是设计约束文件SDC 全称Synopsys design constraints SDC是一个设计中至关重要的一个文件 它对电路的时序 面积 功耗进行约束 它是设计的命脉 决定了芯片是否满足设计要求的规范 Timin
  • C++ vs2015编译json和protobuf报错nlohmann::detail::static_constnlohmann::detail::to_json_fn::value‘

    目录 问题描述 解决方案 参考连接 问题描述 补充 这个问题也会导致protobuf编译和使用报错 按照本方法修复后问题解决 只要引入项目中的 include nlohmann json hpp 用vs2015编译就会报错 甚至用vs202
  • Swift里的元组和可选类型

    文章目录 元组 Tuples 定义一个元组 元组作为函数的返回值 元组的适用范围 可选类型 Optionals 定义可选类型 示例分析 Optional中使用nil 元组 Tuples 元组将多个值分组为一个复合值 元祖中的值可以是任何类型
  • Stream filter()过滤有效数据

    filter 是一个中间操作 可以与 reduce collect map 等一起使用 filter一般适用于list集合 主要作用就是模拟sql查询 从集合中查询想要的数据 java官方文档语法如下 filter Predicate pr
  • 迭代器失效问题

    1 什么是迭代器失效 迭代器失效是一种现象 由特定操作引发 这些特定操作对容器进行操作 使得迭代器不指向容器内的任何元素 或者使得迭代器指向的容器元素发生了改变 2 可能引起迭代器失效的操作 插入元素 扩容引起的迭代器指向的元素或者空间发生
  • python矩阵_Python矩阵

    python矩阵 In this tutorial we will learn about Python Matrix In our previous tutorial we learnt about Python JSON operati
  • 【python 学习 01】命名规范

    命名其实是一个非常重要的事 根据Python之父Guido推荐的命名规范包括如下几点 包名 模块名 局部变量名 函数名 全小写 下划线式驼峰 example this is var 全局变量 全大写 下划线式驼峰 example GLOBA
  • Zabbix---5 监控linux服务器目录大小

    例如监控 root data 目录 一 添加自己脚本 root localhost sbin pwd usr local sbin root localhost sbin cat dir size sh bin bash du m root
  • STM32的CAN总线的接收双FIFO使用方法

    通过下面的框图我们可以看到 STM32F013有两个接收FIFO 但是实际的使用中如何让着两个FIFO都被使用呢 解决办法就在这里 1 STM32F103有0 13共14个过滤器组 每个过滤器组都可以绑定指定的FIFO 2 特别需要注意的一
  • K8s学习笔记二:Ubuntu安装minikube以及K8s简单体验

    Ubuntu安装minikube官方文档看这里 完成Docker十分钟了解Docker 我的Docker学习笔记 和kubectlUbuntu安装kubectl的下载安装后 就可以进行minikube的安装了 它能够帮助我们在本地非常容易的
  • 20145334 《信息安全系统设计基础》第8周学习总结

    转眼已经到了期中复习 听弟弟妹妹们说他们要期中考试了 我们大三上学期的课程也已经过半 考试试题 发现问题及时沟通 首先看一下每周检测解析 这个是比较重要的内容 也是复习和巩固所学知识点的好帮手 下面是老师给出的解析链接 https grou
  • 【mac 安全渗透测试】之SQL注入Demo

    一 关于sqlmap的介绍 1 SQLmap工具简介 SQLmap是一款开源的SQL注入漏洞检测 利用工具 可以检测动态页面中get post参数 cookie http头 它由Python语言开发而成 运行需要安装python环境 在ka
  • arm64架构的linux中断分析(零)

    文章目录 1 中断的概念和作用 2 Linux中断处理机制 2 1 中断请求 2 2 中断处理 2 3 中断完成 2 4 中断触发和处理步骤详解 2 4 1 异常向量表的解读 3 GICv3中断控制器 3 1 GICv3中断控制器设备树 3
  • 触摸屏tslib库交叉编译并移植ARM校准测试

    本文介绍 触摸屏tslib库交叉编译并移植ARM 校准及测试 下载tslib Tags libts tslib GitHub 在tslib的官方github上选择一个版本下载即可 本实验版本为 tslib 1 12 tar gz 1 配置
  • Chisel教程——04.Chisel中的控制流

    控制流 动机 本系列到目前为止 Chisel中的软硬件之间都有很强的对应关系 但引入控制流之后就不一样了 对软硬件的看法就应该有很大的分歧了 本节会在生成器软件和硬件中都引入控制流 如果重新连接到一个Chisel连线会怎么样呢 如何让一个多
  • normalize.css公共样式(vue)

    目录 一 npm安装 二 main ts或者main js引入 三 代码 1 main ts 2 main js 一 npm安装 npm i normalize css 二 main ts或者main js引入 import normali
  • Java在配置环境变量中的 . 是什么意思

    在CLASSPATH中 点号 表示当前目录 举例 CLASSPATH D JAVA LIB C DOC JavaT 这个路径就是包含多个可供选择的查询路径 它们之间用分号 分隔开 更具体的内容可以查阅 Java编程思想 第四版 P112 P
  • 【满分】【华为OD机试真题2023 JS】异常的打卡记录

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 异常的打卡记录 知识点数组字符串哈希表循环 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据 也是计算职工工资的
  • 树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)

    题目如下 一个二叉树 树中每个节点的权值互不相同 现在给出它的后序遍历和中序遍历 请你输出它的层序遍历 输入格式 第一行包含整数 N 表示二叉树的节点数 第二行包含 N 个整数 表示二叉树的后序遍历 第三行包含 N 个整数 表示二叉树的中序