【洛谷P1030】求先序排列[NOIP2001 普及组]
其实是昨天的代码哈哈
这道题向我们展现了前序、中序和后序知二求一的性质
同时,我们应该注意的是,只知道前序和后序,这样的树不是唯一确定的
下面看题目
[NOIP 2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 $ \le 8$)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
样例 #1
样例输入 #1
BADC
BDCA
样例输出 #1
ABCD
提示
【题目来源】
NOIP 2001 普及组第三题
解法&&个人感想
我们采用一个例子来考虑这个问题
比方说 中序排列为DBAGEHCF 后序排列为DBGHEFCA
我们由后序排列的性质知道 A必定为根节点
然后用A将中序排列划分为左子树和右子树
进而得出左子树和右子树的中序/后序排列
一步步递归输出先序排列
知识补充:a.find(char x) 表示在字符串a中找到x的位置 返回值是数组下标(int)
a.substr(pos,len)表示从a的pos位置开始复制len长度的字符串 若len放空则复制到末端
下面看代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string x;
string y;
void dfs(string a,string b){
int alen=a.length();
int blen=b.length();
if(alen==0) return ;
char root=b[blen-1];
cout<<root;
int g=a.find(root);
string lmid=a.substr(0,g);
string rmid=a.substr(g+1);
string llas=b.substr(0,g);
string rlas=b.substr(g,blen-g-1);
dfs(lmid,llas);
dfs(rmid,rlas);
}
int main(){
cin>>x>>y;
dfs(x,y);
system("pause");
return 0;
}

浙公网安备 33010602011771号