【PAT - 甲级1020】Tree Traversals (25分)(树的遍历,给定中序后序,求层次遍历)

题干:

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:

4 1 6 3 5 7 2

解题报告:

样例的树是这样的:

注意写好dfs就行了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n,H[MAX],Z[MAX];
struct Node {int l,r;int val;
} R[MAX];
int tot;
void dfs(int Zl,int Zr,int Hl,int Hr,int& root) {root = ++tot;int tar = H[Hr],pos,rt = root;if(Zl > Zr) return;R[rt].val = tar;for(int i = Zl; i<=Zr; i++) {if(Z[i] == tar) {pos = i;break;}}R[rt].val = tar;dfs(Zl,pos-1,Hl,Hl+(pos-Zl-1),R[rt].l);dfs(pos+1,Zr,Hl+pos-Zl,Hr-1,R[rt].r);
}
void bfs() {int flag = 0;queue<int> q;q.push(1);while(q.size()) {int cur = q.front();q.pop();if(flag == 1) printf(" ");flag = 1; printf("%d",R[cur].val);if(R[cur].l != 0 && R[R[cur].l].val != 0) q.push(R[cur].l);if(R[cur].r != 0 && R[R[cur].r].val != 0) q.push(R[cur].r);}
}
int main()
{cin>>n;for(int i = 1; i<=n; i++) cin>>H[i];for(int i = 1; i<=n; i++) cin>>Z[i];int xx;dfs(1,n,1,n,xx);bfs();return 0 ;
}
/*
71 2 3 4 5 6 72 3 1 5 7 6 4*/

 

错误代码1:

刚开始dfs是这么写的:

void dfs(int Zl,int Zr,int Hl,int Hr,int root) {if(Zl >= Zr) return;int tar = H[Hr],pos,rt = root;R[rt].val = tar;for(int i = Zl; i<=Zr; i++) {if(Z[i] == tar) {pos = i;break;}}R[rt].val = tar;R[rt].l = ++tot; R[rt].r = ++tot;dfs(Zl,pos-1,Hl,Hl+(pos-Zl-1),R[rt].l);dfs(pos+1,Zr,Hl+pos-Zl,Hr-1,R[rt].r);
}

存在问题,叶子节点根本没赋值,就return了。 

后来改成这样:

void dfs(int Zl,int Zr,int Hl,int Hr,int root) {int tar = H[Hr],pos,rt = root;R[rt].val = tar;if(Zl >= Zr) return;for(int i = Zl; i<=Zr; i++) {if(Z[i] == tar) {pos = i;break;}}R[rt].val = tar;R[rt].l = ++tot; R[rt].r = ++tot;dfs(Zl,pos-1,Hl,Hl+(pos-Zl-1),R[rt].l);dfs(pos+1,Zr,Hl+pos-Zl,Hr-1,R[rt].r);
}

存在问题,虽然左或右叶子节点没有值,但是还是给开了节点,也就是不确定有无值的情况下就++tot来开节点了,导致bfs中识别错误了。

 其实这样写也可以AC

AC代码2:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n,H[MAX],Z[MAX];
struct Node {int l,r;int val;
} R[MAX];
int tot=1;
void dfs(int Zl,int Zr,int Hl,int Hr,int root) {int tar = H[Hr],pos,rt = root;if(Zl > Zr) return;R[rt].val = tar;for(int i = Zl; i<=Zr; i++) {if(Z[i] == tar) {pos = i;break;}}R[rt].val = tar;R[rt].l = ++tot; R[rt].r = ++tot;dfs(Zl,pos-1,Hl,Hl+(pos-Zl-1),R[rt].l);dfs(pos+1,Zr,Hl+pos-Zl,Hr-1,R[rt].r);
}
void bfs() {int flag = 0;queue<int> q;q.push(1);while(q.size()) {int cur = q.front();q.pop();if(flag == 1) printf(" ");flag = 1; printf("%d",R[cur].val);if(R[cur].l != 0 && R[R[cur].l].val != 0) q.push(R[cur].l);if(R[cur].r != 0 && R[R[cur].r].val != 0) q.push(R[cur].r);}
}
int main()
{cin>>n;for(int i = 1; i<=n; i++) cin>>H[i];for(int i = 1; i<=n; i++) cin>>Z[i];dfs(1,n,1,n,1);bfs();return 0 ;
}
/*
71 2 3 4 5 6 72 3 1 5 7 6 4*/

总之,要让l>r 和l==r分开处理。不然就容易误杀。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行卡密码的加密、MAC计算

简介 在银行、银联、第三方支付等金融系统中&#xff0c;对银行卡密码等信息的加解密&#xff0c;对交易数据的加解密无处不在&#xff0c;在商场刷卡消费的POS机&#xff0c;在ATM机器取款等都需要对数据加密以保护数据安全&#xff0c;不被窃取。 本文主要对POS机的安全处理…

【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代

列表推导式[x for x in range(n)] 问题&#xff1a;请计算出1~9间的整数的平方 常规方法 for i in range(1,10):print(i*i) 链表推导式&#xff1a; print([x*x for x in range(1,10)]) 匿名函数方法&#xff1a; 匿名函数语法形式&#xff1a; lambda [arg1, arg2, arg3,…

C#多线程和线程池

.Net的公用语言运行时&#xff08;Common Language Runtime&#xff0c;CLR&#xff09;能区分两种不同类型的线程&#xff1a;前台线程和后台线程。这两者的区别就是&#xff1a;应用程序必须运行完所有的前台线程才可以退出&#xff1b;而对于后台线程&#xff0c;应用程序则…

GitHub.com上的那些东西你都知道什么意思吗?

GitHub初学入门者的图谱&#xff0c;介绍Github网站每个功能的意思 一、键盘快捷键 在GitHub中&#xff0c;很多页面都可以使用键盘快捷键。在各个页面按下“shift /”都可以打开键盘快捷键一览表&#xff0c;如下图&#xff1a; 快捷键 二、工具栏 工具栏 LOGO 点击GitHub…

【Python学习】 - sklearn学习 - 数据集分割方法 - 随机划分与K折交叉划分与StratifiedKFold与StratifiedShuffleSplit

一、随机划分 import numpy as np from sklearn import datasetsiris datasets.load_iris() X iris.data y iris.target# 1&#xff09;归一化前&#xff0c;将原始数据分割 from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test train_t…

【Python学习】 - sklearn - 用于生成数据的make_blobs模块

函数原型&#xff1a; sklearn.datasets.make_blobs(n_samples100, n_features2, centers3, cluster_std1.0, center_box(-10.0, 10.0), shuffleTrue, random_stateNone) 参数含义&#xff1a; n_samples: int, optional (default100) The total number of points equally di…

微服务架构及幂等性

微服务架构 微服务架构是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。它的主要作用是将功能分解到离散的各个服务当中&#xff0c;从而降低系统的耦合性&#xff0c;并提供更加灵活的服务支持。 和 微服务 相对应的&#xff0c;这…

【Python学习】 - Matplotlib二维绘图 - plt.matshow()和plt.imshow()区别对比

给定一个8*8的数据&#xff0c;用两种方式分别进行输出。 xx np.zeros((8,8),dtype np.uint8) xx[0,0] 13im Image.fromarray(xx) plt.imshow(im)plt.matshow(xx) plt.show() 输出&#xff1a; 得出结论&#xff1a; 首先我不知道为啥两个窗口是不一样大的。 其次发现图…

【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化

一、为什么要进行数据归一化 定义&#xff1a;把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则&#xff1a;样本的所有特征&#xff0c;在特征空间中&#xff0c;对样本的距离产生的影响是同级的&#xff1b;问题&#xff1a;特征数字化后&#xff0c;由于取值…

【基于Python】 - 人工智能机器学习深度学习数据分析 - 常见问题,常用的套路与操作(持续更新)

20200221&#xff1b; 1.做分类问题的时候&#xff0c;给定你标签&#xff0c;你想知道每一类标签的出现频数&#xff0c;可以使用这个函数&#xff1a;np.bincount()。 如果想分析一下数据样本是否均衡的时候&#xff0c;可以考虑这种操作&#xff0c;代码十分简明。 2. 当…

Entity Framework 简介

转贴&#xff1a;链接https://www.cnblogs.com/davidzhou/p/5348637.html 侵删&#xff0c;谢谢 第一篇&#xff1a;Entity Framework 简介 先从ORM说起吧&#xff0c;很多年前&#xff0c;由于.NET的开源组件不像现在这样发达&#xff0c;更别说一个开源的ORM框架&#xff0…

【Python学习】 - pyecharts包 - 地图可视化

安装&#xff1a; https://pan.baidu.com/s/1vAlSjVbHt0EDJY6C_38oEA 提取码&#xff1a;t9be 在这个链接中下载对应的.whl文件&#xff0c;放到下图所示的目录中。 然后打开anaconda prompt 找到对应的目录&#xff0c;输入&#xff1a; pip install pyecharts-0.1.9.4-py…

【机器学习】 - 关于图像质量评价IQA(Image Quality Assessment)

图像质量评价&#xff08;Image Quality Assessment,IQA&#xff09;是图像处理中的基本技术之一&#xff0c;主要通过对图像进行特性分析研究&#xff0c;然后评估出图像优劣&#xff08;图像失真程度&#xff09;。 主要的目的是使用合适的评价指标&#xff0c;使得评价结果…

【机器学习】 - CNN

什么是卷积神经网络&#xff0c;它为何重要&#xff1f; 卷积神经网络&#xff08;也称作 ConvNets 或 CNN&#xff09;是神经网络的一种&#xff0c;它在图像识别和分类等领域已被证明非常有效。 卷积神经网络除了为机器人和自动驾驶汽车的视觉助力之外&#xff0c;还可以成功…

Asp.Net中WebForm与MVC,Web API模式对比

webform&#xff0c;web mvc和web api都是asp.net官方的三套框架&#xff0c;想对比下三者的关系&#xff0c;查了下资料&#xff0c;web api跟web mvc基本同属一脉&#xff0c;只是mvc多了一个视图渲染&#xff0c;网上有些博客介绍了webform和mvc底层源码实现的不同&#xff…

【机器学习】 - Keras学习 - TensorBoard模块 - 可视化模型训练过程神器

运行环境&#xff1a;Win10 anaconda3。 TensorFlow版本&#xff1a;2.0.0 import numpy as np import tensorflow as tf import tensorflow.keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import matplotlib.pyplot as…

无废话SharePoint入门教程一[SharePoint概述]

一、前言 听说SharePoint也有一段时间了&#xff0c;可一直处在门外。最近被调到SharePoint实施项目小组&#xff0c;就随着工作一起学习了一下实施与开发。但苦于网上SharePoint入门的东西实在太少&#xff0c;导致自学入门很难&#xff0c;不知道SharePoint这东西到底能做什么…

SharePoint 站点结构及概念

简单的记录一下Sharepoint的结构与基本概念 一、服务器场 服务器场,即主机的集群.简单点说就是两台机器互相备份&#xff0c;两个或几台机器之间有心跳线&#xff0c;定时检测对端设备的情况&#xff0c;如果对端设备出现故障&#xff0c;一台机器就会接管出问题机器的受保护…

【Python学习】 - sklearn学习 - 自带数据集sklearn.datasets.x

sklearn 的数据集有好多个种 自带的小数据集&#xff08;packaged dataset&#xff09;&#xff1a;sklearn.datasets.load_可在线下载的数据集&#xff08;Downloaded Dataset&#xff09;&#xff1a;sklearn.datasets.fetch_计算机生成的数据集&#xff08;Generated Datas…

sharepoint 概念及认证方式介绍

3.SharePoint Web 应用程序 我个人的理解&#xff0c;SharePoint Web 应用程序&#xff08;SharePoint Web Application&#xff09;代表的是 SharePoint 网站&#xff08;集&#xff09;的物理容器。 SharePoint Web 应用程序需要指定内容数据库、宿主 IIS 应用程序池、应用…