浪漫侧影 ( 题解 )
“侧影”就是从左侧或者右侧去观察物体所看到的内容。例如上图中男生的侧影是从他右侧看过去的样子,叫“右视图”;女生的侧影是从她左侧看过去的样子,叫“左视图”。
520 这个日子还在打比赛的你,也就抱着一棵二叉树左看看右看看了……
我们将二叉树的“侧影”定义为从一侧能看到的所有结点从上到下形成的序列。例如下图这棵二叉树,其右视图就是 { 1, 2, 3, 4, 5 },左视图就是 { 1, 6, 7, 8, 5 }。
于是让我们首先通过一棵二叉树的中序遍历序列和后序遍历序列构建出一棵树,然后你要输出这棵树的左视图和右视图。
输入格式:
输入第一行给出一个正整数 N (≤20),为树中的结点个数。随后在两行中先后给出树的中序遍历和后序遍历序列。树中所有键值都不相同,其数值大小无关紧要,都不超过 int 的范围。
输出格式:
第一行输出右视图,第二行输出左视图,格式如样例所示。
输入样例:
8
6 8 7 4 5 1 3 2
8 5 4 7 6 3 2 1
输出样例:
R: 1 2 3 4 5
L: 1 6 7 8 5
个人思路:
此题有两个考点,首先是根据树的中序遍历和其余任意遍历(前序遍历,后序遍历,层序遍历)构建一颗二叉树,其次是对一颗二叉树的层序遍历。
做法:
根据遍历建好二叉树,再进行层序遍历,当进行至每两层的交接点时,恰好是上一层的“右视图”,和下一层的“左视图”,将其值记录下来,注意要处理特殊情况,头节点和最下层的右视图。
最后将结果输出。
1.建树
由于要保存左右子节点,树的高度,每个节点的值,所以选择结构体建树。
通过递归的方式,分别处理前序和中序遍历,注意每棵子树对应遍历的起点和终点。
2.遍历
普通层序遍历,加入对高度的判断即可。
AC代码(注释解释):
#include <bits/stdc++.h>
using namespace std;
const int N = 21;
int l[N], r[N], in[N], post[N];//l,r分别为左右视图数组,in中序,post后序
int z=0, y=0 ,n, m; //z左,y右
typedef struct Node* pnode;
struct Node {int data; //数据int h; //高度pnode l, r;
};
typedef pnode Tree;
//il,ir分别为中序遍历起点和终点,pl,pr分别为后序遍历起点和终点
Tree create(int il, int ir, int pl, int pr, int high) {Tree t;if (pl > pr) return NULL; //此时对应子树为空,返回NULLt = (pnode)malloc(sizeof(struct Node));t->data = post[pr]; //后序遍历每一段最后一个就是根节点t->h = high;int i = il;while(in[i] != post[pr]) i++; //用i找到根节点对应的中序遍历中的位置t->l = create(il, i - 1, pl, pl + i - 1 - il, high + 1);t->r = create(i + 1, ir, pl + i - il, pr - 1, high + 1);return t; //递归建树
}void Bianli(Tree t) {pnode p, pre=NULL;queue<Tree> q;if (t == NULL) return;q.push(t);while (!q.empty()) {p = q.front();q.pop();if (pre == NULL) l[z++] = p->data; //对头节点的处理else {if (p->h != pre->h) {l[z++] = p->data;r[y++] = pre->data;}}pre = p;if (p->l) q.push(p->l);if (p->r) q.push(p->r);}r[y++] = p->data; //对最后一个右视图的处理
}int main() {cin >> n;for (int i = 0; i < n; i++)cin >> in[i];for (int i = 0; i < n; i++)cin >> post[i];Tree t = create(0, n - 1, 0, n - 1, 0);Bianli(t);cout << "R:";for (int i = 0; i < z; i++)cout << " " << r[i];cout << endl << "L:";for (int i = 0; i < y; i++)cout << " " << l[i];cout << endl;return 0;}
浪漫侧影 ( 题解 )相关推荐
- 520 钻石争霸赛 7-8浪漫侧影(二叉树的遍历)
"侧影"就是从左侧或者右侧去观察物体所看到的内容.例如上图中男生的侧影是从他右侧看过去的样子,叫"右视图":女生的侧影是从她左侧看过去的样子,叫"左视 ...
- 7-8 浪漫侧影 (25 分)
"侧影"就是从左侧或者右侧去观察物体所看到的内容.例如上图中男生的侧影是从他右侧看过去的样子,叫"右视图":女生的侧影是从她左侧看过去的样子,叫"左视 ...
- 520 钻石争霸赛 2021 7-8 浪漫侧影 (25 分)
题目描述 "侧影"就是从左侧或者右侧去观察物体所看到的内容.例如上图中男生的侧影是从他右侧看过去的样子,叫"右视图":女生的侧影是从她左侧看过去的样子,叫&qu ...
- PTA 浪漫侧影 Python
前置知识: 对于不一定是完全二叉树,根据已知的中序+后序(前序)遍历顺序来建树(ps:中序一定是需要的) 参考大佬博客:已知中序和前序(或后序)遍历结果生成树_勿忘初心丶的博客-CSDN博客_已知中序 ...
- 2022天梯赛热身赛 浪漫侧影(什么原题)
题意: 给定一棵二叉树的中序和后序遍历,求左视图和右视图.意思是求每一层的第一个节点和最后一个节点,层次遍历就行了.套皮题. 思路: 1.我的笨法,由于每个数的值不一样,直接建的树,之后bfs即可,写 ...
- PTA 520 钻石争霸赛 2021
有一道题没来得及做,目前的排名是57,不知道后面会被挤到哪里. 文章目录 7-1 自动编程 (5 分) 7-2 加油冲鸭 (10 分) 7-3 520的表白 (10 分) 7-4 奇葩楼层 (15 分 ...
- 520 钻石争霸赛 2021
文章目录 7-1 自动编程 (5 分) 输入格式: 输出格式: 输入样例: 输出样例: Code 7-2 加油冲鸭 (10 分) 输入格式: 输出格式: 输入样例 1: 输出样例 1: 输入样例 2: ...
- 2022年团体程序设计天梯赛-模拟赛
文章目录 L1-1 自动编程 (5 分) L1-2 太神奇了 (5 分) L1-3 洛希极限 (10 分) L1-4 吃鱼还是吃肉 (10 分) L1-5 不变初心数 (15 分) 题解 L1-6 字 ...
- 【PTA】520 钻石争霸赛 2021,119分
序 大概写了30mins多点,后来有事情去了就溜了没打完 勾股定理最后一个点WA了少了1分,错误数据是1e4大概暴力T了,不过没时间改了 7-1 自动编程 (5 分) 7-1 自动编程 (5 分) 输 ...
最新文章
- html里字号rem,html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?...
- c 语言要记多少函数,学C语言要熟记那些基本语句?
- Oracle存储过程语法
- 如何在后台配置中找到某个具体配置的事务码
- Python爬虫自己写项目之:爬取火车站的时刻表和票务信息
- 微信小程序:网课查题微信小程序源码下载,题库资源丰富自动采集,支持语音拍照识别
- 字节跳动面试题后台_JAVA字节跳动面试题分享,一面
- 红外光通信装置数字部分思路点睛 2013年国赛f题
- 有一种单身叫宁缺勿滥 -- 纪念百年神棍节
- 阅读 |《算法图解》读书打卡
- 医院预约挂号mysql_医院预约挂号系统代码 mysql+myeclipse
- (小米系统系列三)刷机成功后卡在开机引导页,将电脑设置成热点,给手机提供验证网络的方法
- 使用python计算三角形面积
- 自学CTP客户端开发记录001
- 华为鸿蒙任正非专访,任正非接受专访:华为鸿蒙系统将比安卓速度快60%
- python计算三阶行列式
- 基于jsp的教师科研工作量_高校教师科研工作量考核与管理暂行办法
- Python测试框架Pytest的基础入门
- Unity中文界面整理
- 机器学习与知识发现_在机器学习中重新“发现”量子力学
热门文章
- filters过滤器的使用方法
- 第一型曲线积分与第一型曲面积分、第二型曲线积分与格林公式
- C++信息学奥赛一本通(T1413:确定进制)
- 利用特征值与特征向量求解弹性力学中的主应力与主平面问题
- 电商网上购物成为非洲人喜欢的一种新颖购物方式
- android wifi tethering,新增Wi-Fi/USB Tethering功能
- 【群晖NAS】真·免费内网穿透方案 及踩坑合集
- STM32使能/屏蔽外部中断
- python时间函数纳秒_python 时间 纳秒_Pandas时间序列(翻译)
- 网站设计高性能高并发