题解 P1030 【求先序排列】
题解 P1030 【求先序排列】
旧题新解~
今天做这个题,发现还是没有AC,于是滚回来用了一大堆数据结构A了这个题目,好像复杂度还挺高......
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
char mid[101],late[101];
int mid_[101],late_[101],len=0;
struct tree{
tree *lson,*rson;
int ch;
}rt_,*rt=&rt_;
map<int,char>ic;
map<char,int>ci;
stack<char>qwq;
void build(int ch,tree *root);
inline void clear_(tree *root);
void print1(tree *root);
int main()
{
clear_(rt);
scanf("%s%s",mid,late);
len=strlen(mid);
for (register int i=0;i<len;i++)
{
ic.insert(make_pair(i+1,mid[i]));
ci.insert(make_pair(mid[i],i+1));
}
for (register int i=0;i<len;i++)
{
late_[i]=ci[late[i]];
}
reverse(late_,late_+len);
for (register int i=0;i<len;i++)
{
build(late_[i],rt);
}
print1(rt);
while (!qwq.empty())
{
putchar(qwq.top());
qwq.pop();
}
return 0;
}
void build(int ch,tree *root)
{
if (root->ch==-1||root->ch==ch)//相等或者是新的节点
{
root->ch=ch;//直接赋值不多说
return ;
}
else if (root->ch<ch)//小于建左树
{
if (root->lson==NULL)//如果没开点就开点
{
root->lson=new tree();
clear_(root->lson);
}
build(ch,root->lson);//递归建左子树
}
else //那就只剩下大于咯
{
if (root->rson==NULL)//如果没开点就开点
{
root->rson=new tree();
clear_(root->rson);
}
build(ch,root->rson);//递归建右子树
}
}
inline void clear_(tree *root)
{
root->lson=root->rson=NULL;
root->ch=-1;
}
void print1(tree *root)//先序排列
{
if (root->lson!=NULL)print1(root->lson);
if (root->rson!=NULL)print1(root->rson);
qwq.push(ic[root->ch]);
}
看看这一长串代码,令人生畏......
首先把题目摆上......
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\(n≤8\))。
输入输出格式
输入格式:
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
11行,表示一棵二叉树的先序。
输入输出样例
输入样例#1: 输出样例#1: BADCBDCAABCD
拿过来一看,不就是模拟吗!
但是我们将原先的中序和后序都离散化成二叉搜索树(闲得慌????),就变得好理解了许多(中规中蒟)
原文作者说:
因为对于二叉搜索树左小右大的原则,其中序遍历即为树中的元素的升序排列。而后序遍历是按先左子右子再根节点的顺序输出。
因此 对于二叉搜索树而言——
如果按照其后序遍历的颠倒后的顺序插入元素,就可以还原整棵树!
原因是在元素x被插入以前,x的父节点已经插入在树中(后序遍历的颠倒后的顺序),因此x一定会插入到原来的树中的位置上。
原来如果我们按照颠倒的后序遍历建一个二叉搜索树,然后将输出的字符串存入stack<char>,然后再倒着输出,就完成先序遍历的操作。
感觉有点迷?不要紧,还有一发。
Q1:为什么要颠倒插入?
A:因为后序遍历就是离散化后的从大到小的排序,所以我们将其反转,就可以得到一个先序遍历。按照先序遍历,可以还原整棵树。
Q2:为什么最后要颠倒输出?
因为我们得到的是先序遍历的离散化数据,所以答案反而是逆序的字母串。
Clear?
题解 P1030 【求先序排列】的更多相关文章
- 洛谷 P1030 求先序排列 Label:None
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列
题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...
- P1030 求先序排列 /// 二叉树的遍历
题目大意: 给一棵树的中序排列 后序排列,求这棵树的先序排列 https://www.luogu.org/problemnew/show/P1030 二叉树的四种遍历解说 几种遍历的递归实现 后序排列 ...
- P1030 求先序排列 P1305 新二叉树
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度\le 8≤8). 输入输出格式 输入格式: 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与 ...
- 洛谷P1030求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...
- 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
- P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- 洛谷 P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- 洛谷——P1030 求先序排列
https://www.luogu.org/problem/show?pid=1030#sub 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度< ...
- P1030 求先序排列 (一个非常棒的写法)
理论正确就是真正的正确,误... 就是找嘛,找到每一个对应字符,然后对应的左右子树的区间,然后就可以了. #include <bits/stdc++.h> using namespace ...
随机推荐
- Git与TortoiseGit基本操作
Git与TortoiseGit基本操作 1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(C ...
- 网络对抗技术 2017-2018-2 20152515 Exp2 后门原理与实践
1.实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) 关于netcat:是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起到后门的作用. 相 ...
- # 20155337《网络对抗》Web基础
20155337<网络对抗>Exp8 Web基础 实践目标 1. 实践内容 (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写 ...
- HW 2017 12 17可禾大佬神题
好不容易搞来的题目,不写一写怎么行呢. 不过难度真心不高(一小时K掉),都是老题+暴力题,没有欧洲玄学. 再说一句,这试卷是叶可禾出的吧. T1 好老的题目,看到有多组数据我还怕了,以为有更流弊的算法 ...
- 微信小程序之地理位置授权 wx.getLocation
1. 授权地理位置 点击按钮,弹出授权弹窗,点击允许后,在以后的操作中可以随时获取到用户地理位置 点击拒绝后,将无法获取到地理位置,也无法再次点击弹出弹窗. <button bindtap='o ...
- zabbix监控docker容器状态
前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,za ...
- Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...
- 团队作业week9
1. Bug bash ▪ How many bugs is found in your bug bash? 2. Write a blog to talk about your scenario t ...
- Linux内核分析 一二章读书笔记
第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...
- linux 内核 第四周 扒开系统调用的三层皮 上
姬梦馨 原创作品 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来:库函数帮我们把系 ...