【洛谷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;
}
posted @ 2025-02-11 00:12  elainafan  阅读(66)  评论(0)    收藏  举报