洛谷 1030 先序排列
2016-12-15 21:10
253 查看
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入输出格式
输入格式:2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
1行,表示一棵二叉树的先序。
输入输出样例
输入样例#1:BADC BDCA
输出样例#1:
ABCD
中序和后序确定前序的规则
后序的最后一个值一定是根节点 然后扫描中序排列 找到根节点, 中序排列的左边为左子树,右边为右子树。之后 后序排列是后跟形式的 换句话说
中序序列去掉根节点左边的数目,和后序排列前后数同样的数目 为左子树
之后进入递归
以下是大神的解释 摘自洛谷题解, 比较清晰
DEBAFCG
EDBFGCA
首先这棵树的根是A(后序排列的最后一个),输出A;
然后在中序排列中找到A的位置,发现它左右各有三个点,分别是它的左右子树;
把中序排列左边三个点和后序排列的前三个点作为左子树去dfs,因为先序排列是中-左-右,所以先走左边;
> [L]传入的中序是DEB,后序是EDB - 输出B,DE是左子树,同样操作;
>> [L]传入的中序是DE,后序是ED - 输出D,E是右子树,同样操作;
>>> [R]传入的中序是E,后序是E - 输出E;
> [R]传入的中序是FCG,后序是FGC - 输出C,F是左子树,同样操作,G是右子树,同样操作;
>> [L] 传入的中序是F,后序是F - 输出F;
>> [R] 传入的中序是G,后序是G - 输出G;
这样我们就完成了求先序遍历的过程。(上面略去了L/R子树为空的场合。
#include <iostream> #include <cstring> #include <iomanip> #include <cstdio> #include <string> #include <algorithm> #include <queue> #include <cmath> #include <map> using namespace std; string mid; string last; void dfs(int l,int r,int z,int y) { if(l>r||z>y) return ; cout<<last[y]; for(int i=l;i<=r;i++) { if(last[y]==mid[i]) { dfs(l,i-1,z,z+i-l-1); dfs(i+1,r,z+i-l,y-1); } } } int main() { cin>>mid; cin>>last; int l=strlen(&mid[0]); dfs(0,l-1,0,l-1); }
相关文章推荐
- 洛谷 P1439 排列LCS问题
- xjb——洛谷 P1439 排列LCS问题
- 洛谷P1030 求先序排列
- 洛谷 P1439 排列LCS问题
- 洛谷 P1030 求先序排列
- 【树形结构】洛谷 P1030 求先序排列
- 洛谷P1030 求先序排列
- 洛谷 P1439 排列LCS问题
- 洛谷P1030 求先序排列
- 洛谷P4163 [SCOI2007]排列
- 洛谷1439 排列LCS问题
- 洛谷 P1706 全排列
- 洛谷——P1030 求先序排列
- 洛谷P1439 排列LCS问题
- 洛谷 排列LCS P1439 (LCS)
- 求全排列的数学方法(洛谷1088 火星人noip2004普及组第4题)
- 洛谷 P1030 求先序排列
- 全排列(洛谷1061 Jam的计数法or NOIP 2006 普及组 第三题)
- 洛谷 P1030 求先序排列
- 洛谷1439 排列LCS问题