L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
解题思路:首先我们根据后序遍历最后一个数可确定二叉树的根,然后再从中序遍历找到该节点便能确定该根节点左右子树的节点,举个例子拿样例来说:
初始时,我们根据后序遍历知道整棵树的根节点是4,于是我们便在中序遍历找到4的位置,我们就可以确定,节点1,2,3在根节点左子树,节点3,5,7,2在根节点右子树,于是我们又采用此方法,递归在后序遍历的区间【1,3】和中序遍历的区间【1,3】建立4的左子树,在后序遍历的区间【4,6】和中序遍历的区间【5,7】建立4的右子树就可以了。
具体方法看代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,post[],mid[];
struct node{
int l,r;
}tree[];
vector<int> ans;
int build(int l1,int r1,int l2,int r2){//l1,r1表示中序遍历的左右边间,l2,r2表示后序遍历的左右边界
if(l1>r1)return ; //递归结束条件即没有元素可以遍历
int p1,cnt,rt=post[r2]; //rt为当前子树的根节点 即为当前后序遍历的最后一个数
p1=l1; //初始p1位中序遍历的左边界
while(mid[p1]!=rt)p1++; //在中序遍历中查找根节点所在位置
cnt=p1-l1; //计算当前根节点的子节点个数
tree[rt].l=build(l1,p1-,l2,l2+cnt-); //递归构建左子树
tree[rt].r=build(p1+,r1,l2+cnt,r2-); //递归构建右子树
return rt;
}
void bfs(int rt){ //bfs搜索层序遍历
queue<int> que;
que.push(rt);
ans.push_back(rt);
while(que.size()){
int u=que.front();
que.pop();
if(tree[u].l!=){
que.push(tree[u].l);
ans.push_back(tree[u].l);
}
if(tree[u].r!=){
que.push(tree[u].r);
ans.push_back(tree[u].r);
}
}
for(int i=;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-)cout<<" ";
else cout<<endl;
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++)cin>>post[i];
for(int i=;i<=n;i++)cin>>mid[i];
int root=build(,n,,n);
bfs(root);
return ;
}
L2-011 玩转二叉树 (25 分)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805065406070784
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
解题思路:和上题几乎是一样的,把后序改为先序,先序遍历的第一个元素就是根节点,知道这个就可以了。镜面反转只需要改变一下bfs的搜索方式就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,root,pre[],mid[];
struct node{
int l,r;
}tree[];
vector<int> ans;
int build(int l1,int r1,int l2,int r2){//l1,r1为中序遍历的左右边界,l2,r2为先序遍历的左右边界
if(l1>r1)return ;
int p,cnt,rt=pre[l2]; //先序遍历的第一个元素为当前树的树根
p=l1;
while(mid[p]!=rt)p++;
cnt=p-l1;
tree[rt].l=build(l1,p-,l2+,l2+cnt);
tree[rt].r=build(p+,r1,l2+cnt+,r2);
return rt;
}
void bfs(int rt){
queue<int> que;
que.push(rt);
ans.push_back(rt);
while(que.size()){
int u=que.front();
que.pop();
if(tree[u].r!=){
ans.push_back(tree[u].r);
que.push(tree[u].r);
}
if(tree[u].l!=){
ans.push_back(tree[u].l);
que.push(tree[u].l);
}
}
for(int i=;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-)cout<<" ";
else cout<<endl;
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++)cin>>mid[i];
for(int i=;i<=n;i++)cin>>pre[i];
root=build(,n,,n);
bfs(root);
return ;
}
L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)的更多相关文章
- PTA 7-3 树的遍历 (25分)
PTA 7-3 树的遍历 (25分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点 ...
- PTA 03-树1 树的同构 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/711 5-3 树的同构 (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右 ...
- PTA 根据后序和中序遍历输出先序遍历 (25分)
PTA 根据后序和中序遍历输出先序遍历 (25分) 本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果. 输入格式: 第一行给出正整数N(≤30),是树中结点的个数.随后两行 ...
- PTA 树的同构 (25分)
PTA 树的同构 (25分) 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号):随后N行,第i行对应编号第 ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- 2020天梯赛总决赛L2-3 完全二叉树的层序遍历 (25分)
题目:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全 ...
- PAT A1099 Build A Binary Search Tree (30 分)——二叉搜索树,中序遍历,层序遍历
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...
- PAT 03-树1 树的同构 (25分)
给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后 ...
随机推荐
- Android为TV端助力 eclipse build project 出现major.minor version 52.0的问题
那些网上说的JDK什么的的问题,我求你们不要误人子弟好吗? 出现在这个的原因就是ADT也就是你的SDK manager 的Tools版本跟你的SDK版本不兼容,如果你的是SDK 23.0.2那你的To ...
- Linux 安装 powershell
linux 安装 powershell Intro powershell 已经推出了一个 Powershell Core, 版本号对应 Powershell 6.x,可以跨平台,支持 Linux 和 ...
- 容器化系列 - 通过Grafana监测InfluxDB数据 on Docker
本文演示在Docker中运行Grafana和InfluxDB,并通过Grafana展示InfluxDB曲线图. 1 准备工作 1.1 安装Docker 请参考这里 1.2 下载镜像 $ docker ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...
- c#高级编程_第10版 云盘地址
下载地址 链接:https://pan.baidu.com/s/1u8PcY4RJhRB1yfm-2XaTEQ 密码:159z
- django自定义分页器
一 django 的分页器 1 批量创建数据 批量导入数据: Booklist=[] for i in range(100): Booklist.append(Book(title="boo ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 本文详解5G是个什么鬼,程序员都准备好了吗?
无线移动通讯发展历史 最近5G的概念炒的如火如荼,为此,华为和高通还干了一仗.这篇文章从技术层面给大家分析,什么是5G,它和4G比,高级在哪里? 我们来看看移动互联网的技术发展: 然后我们在来看看他们 ...
- [转帖] CA如何保护自己的私钥
作者:Gh0u1L5链接:https://www.zhihu.com/question/22260090/answer/648910720来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Linux基础操作文件等基础操作
作业一: 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon /]# cd /etc [root@bogon etc]# cat passwd ...