树的遍历(bfs+递归)

2023-10-27

题目描述

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

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

输入描述

第一行包含整数 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

思路:

设置一个哈希表存左儿子,右儿子,和每个节点的位置,一共涉及两个函数,一个函数用来建立二叉树,一个函数用来遍历左右子树,这个题有一点需要注意的就是后序遍历的左右子的确定

关于build函数:传入中序遍历和后序遍历的左右边界,令根节点等于后序遍历的右边界,也就是最后一个数,k记录根节点的位置,分别对左右子树进行递归

关于bfs函数:这个函数让树先序输出出来,定义一个队列,将根节点存进去,q存在时候,弹出的队头节点输出,因为先序遍历是根左右,然后判断左右子树是否存在,如果存在,push到队列

代码样例

#include<iostream>
#include<map>
#include<bits/stdc++.h>
using namespace std;
#define N 50
map< int,int > l,r,mp;//mp记录数据的下标,l,r表示根的左右孩子 
int inorder[N],order[N];//记录中序遍历和后序遍历
//参数是中序遍历的左端点右端点,后续遍历的左右端点 
int creatTree(int il,int ir,int pl,int pr){
    int k,root;
    root=order[pr];//根节点是后序遍历的最后值 
    k=mp[root];//表示根节点对应的下标 
    //如果存在左子树,构造最左子树 
    if(il<k)
    l[root]=creatTree(il,k-1,pl,k+pl-il-1);
    //如果存在右子树,构造右子树 
    if(ir>k)
    r[root]=creatTree(k+1,ir,pr+k-ir,pr-1);
    return root;
}
void bfs(int root){
    queue<int> p;
    int t; 
    p.push(root);//将根节点放到队列 
    while(!p.empty()){
        t=p.front();//把队列的首元素赋值给t 
        cout<<t<<" ";//输出t 
        p.pop();//删除队头元素 
        //判断节点是否存在左右节点 
        if(l[t])
        p.push(l[t]);
        if(r[t])
        p.push(r[t]);
    }
}
int main(){
    int n,root;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>order[i];
    for(int i=0;i<n;i++){
        cin>>inorder[i];
        mp[inorder[i]]=i;
    }
    root=creatTree(0,n-1,0,n-1);//构建二叉树 
    bfs(root);//层序遍历 
    return 0;
} 

这道题用到递归比较简单,它也能锻炼大家对树的理解,谢谢大家。

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

树的遍历(bfs+递归) 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • ubuntu查看系统资源占用(内存,cpu和进程)

    转载自网易博客 http bluexp29 blog 163 com blog static 33858148201071534450856 bluexp29的博客 linux真是太强大了 查看ubuntu的资源占用的命令为 top top
  • odoo第三方模块审批模块的使用

    1 激活超级用户 因为里面的domain限制了一些字段非超级用户只读 2 依次点击 设置 gt gt 审批流设置 设置审批流 审批流设置完成后 进入所绑定模型的form视图 可以看到多了三个动作
  • python 自(1)定义变量 数据类型 判断数据类型 转换数据类型 算数运算符 复合运算符 比较运算符 逻辑运算符 赋值运算符

    注释 注释 就是一个 也可以 ctrl 也可以出来注释 命名规范 标识符 由字母 下划线 数字 组成 数字不能开头 不可以使用 关键字 严格区分大小写 定义变量 变量定义 重复利用 例如 cons 你好小周 print cons print
  • 【论文阅读-ASE 2020】利用单词重叠信息的代码检索 OCoR: An Overlapping-Aware Code Retriever

    OCoR An Overlapping Aware Code Retriever Conference ASE 2020 Authors 摘要 代码搜索任务是通过给出一段自然语言描述 模型能够找到一系列最相关的代码片段 由此来帮助开发人员重
  • Spring中单例bean注入多例bean的解决方法

    1 问题描述 在项目代码的使用过程 单例对象A中需要注入对象B B对象要求是多例的 我们在对象B上添加注解 Scope prototype 代码运行过程中 发现A中注入的B对象始终是同一个 并没有实现多例的效果 下面展示一些 内联代码片 C
  • 蓝桥云课——跳跃 Python(动态规划)

    题目地址 跳跃 此题是一道比较经典又带有一定难度的动态规划题目 且听我慢慢道来 虽然不一定能讲明白 先输入数据 n m map int input split score for i in range n score append list
  • Activiti6.0学习实践(4)-流程引擎配置一

    在上一节 我们进行了一个hello world 的简单应用搭建 本节继续对activiti的一些重要组件进行更进一步的分析 目录 1 activiti工程骨架 1 2 添加demo类到骨架工程 1 3 创建基于骨架的maven工程 2 流程
  • Leetcode20. 给定字符串,判断括号是否有效,不可用栈

    class Solution public boolean isValid String s int len s length if s length 2 1 s length 0 return false else for int i 0
  • SpringBoot项目——创建菜单与游戏页面

    SpringBoot项目 vue 实现游戏页面 回顾 SpringBoot项目 配置git环境与项目创建 文章目录 SpringBoot项目 vue 实现游戏页面 vue 实现前端页面 Web 一 导航栏功能 PK地图的实现 二 js 控制
  • c3p0连接池和druid连接池的使用

    1 c3p0连接池 没有配置文件的情况下 Test public void T1 throws SQLException PropertyVetoException ComboPooledDataSource cpds new ComboP
  • Keil N01:的软件逻辑分析仪( logic analyzer)使用

    在keil MDK中软件逻辑分析仪很强的功能 可以分析数字信号 模拟化的信号 CPU的总线 UART IIC等一切有输出的管脚 提供调试函数机制 用于产生自定义的信号 如Sin 三角波 澡声信号等 这些都可以定义 以keil里自带的stm3
  • 3.网络爬虫——Requests模块get请求与实战

    Requests模块get请求与实战 requests简介 检查数据 请求数据 保存数据 前言 前两章我们介绍了爬虫和HTML的组成 方便我们后续爬虫学习 今天就教大家怎么去爬取一个网站的源代码 后面学习中就能从源码中找到我们想要的数据 此
  • 中级软件设计师考试(软考中级)考试简介与考试内容分布

    原文链接 中级软件设计师考试 软考中级 考试简介与考试内容分布 文章目录 一 考试简介 1 1 软件设计师考试是什么 1 2 通过软件设计师考试应该具备的技术能力 1 3 软件设计师 中级 资格简介 1 4 什么是评什么是聘 1 5 什么是
  • java 栈----java.util.Stack

    Stack类简介 Stack 类表示后进先出 LIFO 的对象堆栈 它通过五个操作对类 Vector 进行了扩展 Stack类继承自Vector类 允许将向量视为堆栈 它提供了通常的 push 和 pop 操作 以及取堆栈顶点的 peek
  • 软件测试-外国语言和易用性测试

    1 外国语言测试 1 1 使用文字图片有意义 开发软件时 考虑用户的国家和地理位置 使软件适应特定地域特征 照顾到语言 方言 地区习俗和文化的过程称为本地化 测试此类软件称为本地化测试 1 2 翻译问题 文本扩展 将英语翻译成其他语言时 通
  • spring框架整合shiro

    shiro框架 定义 Shiro是apache旗下一个开源框架 它将实现用户身份认证 权限授权 加密 会话管理等功能 组成了一个通用的安全认证框架 既然shiro将安全认证相关的功能抽取出来组成一个框架 使用shiro就可以非常快速的完成认
  • 使用frp工具实现内网穿透以及配置多个ssh和web服务

    frp简介 FRP 项目地址 https github com fatedier frp blob master README zh md frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 h
  • qt中的toUtf8, toLatin1, Local8bit, toUcs4

    1 首先说下字符集 gb18030字符集兼容了gbk字符集 以两个字节表示一个文字 windows系统可能使用的就是这两种的一种 unicode字符集以2个或以上的字节表示一个汉字 通用字符集 Universal Character Set
  • Windows操作系统安全加固基线检测脚本

    一 背景信息 在我们的安全运维工作中经常需要进行安全基线配置和检查 所谓的安全基线配置就是系统的最基础的安全配置 安全基线检查涉及操作系统 中间件 数据库 甚至是交换机等网络基础设备的检查 面对如此繁多的检查项 自动化的脚本可以帮助我们快速
  • 树的遍历(bfs+递归)

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