当前位置: 首页 > news >正文

PAT甲级真题1020树的遍历

哈希表可以在O(1)的时间内找到后序遍历的根结点在中序遍历的位置

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>using namespace std;const int N = 40;int n;
int postorder[N], inorder[N];
unordered_map<int, int> l, r, pos;//用哈希表存左儿子和右儿子,和映射//中序遍历的左端点和右端点,后序遍历的左端点和右端点
int build(int il, int ir, int pl, int pr)
{int root = postorder[pr];//根节点是后序遍历的最后一个点int k = pos[root];//找到根节点在中序遍历的下标if (il < k) l[root] = build(il, k - 1, pl, pl + (k - 1 - il));if (k < ir) r[root] = build(k + 1, ir, pl + (k - 1 - il) + 1, pr - 1);return root;//返回当前这个子树的根节点
}void bfs(int root)
{queue<int>q;q.push(root);while(q.size()){auto t=q.front();q.pop();cout<<t<<" ";if(l.count(t))q.push(l[t]);//如果存在左子树,将左子树插到队列中if(r.count(t))q.push(r[t]);}
}int main()
{cin >> n;for (int i = 0; i < n; i ++ ) cin >> postorder[i];//后序遍历for (int i = 0; i < n; i ++ ){cin >> inorder[i];//中序遍历pos[inorder[i]] = i;//映射,存中序遍历每个值的下标是多少}int root = build(0, n - 1, 0, n - 1);//重建二叉树,中序遍历的下标是0到n-1,后序遍历的下标也是0到n-1bfs(root);return 0;
}//需要在中序遍历里找到某个值的位置,因此可以用哈希表存中序遍历每个值的下标是多少

输出左子树和右子树

    for(auto &pl:l)//pr是名字,随便取{cout<<pl.first<<"->"<<pl.second<<endl;}cout<<endl;for(auto &pr:r)//pr是名字,随便取{cout<<pr.first<<"->"<<pr.second<<endl;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案
  • MFC CRectTracker 类用法详解
  • Linux环境下安装Nodejs
  • Flutter热更新技术探索
  • 【ffmpeg命令入门】重新编码媒体流、设置码率、设置帧速率
  • 昇思25天学习打卡营第21天|DCGAN生成漫画头像
  • 算法学习笔记:贪心算法
  • Java集合框架的内部揭秘:List、Set与Map的深潜之旅
  • PHP MySQL 创建数据库
  • 数仓工具—Hive语法之宏(Macro)
  • 数据采集监控平台:挖掘数据价值 高效高速生产!
  • 单例模式 单例模式在多线程中是否线程安全, 如何保证线程安全。
  • react中状态管理useState
  • 计算1的数量
  • Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)
  • __proto__ 和 prototype的关系
  • 2017年终总结、随想
  • iOS | NSProxy
  • Next.js之基础概念(二)
  • PHP变量
  • Promise初体验
  • 当SetTimeout遇到了字符串
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 订阅Forge Viewer所有的事件
  • 给初学者:JavaScript 中数组操作注意点
  • 如何设计一个比特币钱包服务
  • 设计模式(12)迭代器模式(讲解+应用)
  • 网络应用优化——时延与带宽
  • 移动端解决方案学习记录
  • raise 与 raise ... from 的区别
  • 第二十章:异步和文件I/O.(二十三)
  • 通过调用文摘列表API获取文摘
  • ​一些不规范的GTID使用场景
  • $().each和$.each的区别
  • (pycharm)安装python库函数Matplotlib步骤
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .htaccess 强制https 单独排除某个目录
  • .net 受管制代码
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET构架之我见
  • .NET开源项目介绍及资源推荐:数据持久层
  • /etc/motd and /etc/issue
  • @Value读取properties中文乱码解决方案
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [Angular] 笔记 6:ngStyle
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C++]指针与结构体
  • [C++初阶]vector的初步理解
  • [CCIE历程]CCIE # 20604
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口