【题解】P1030 求先序排列

题面

题目传送门

前言

我嘞个超绝典题啊

正文

一些比较显然的思路捏~

首先我们知道对于一棵二叉树的后序遍历,一定有其最后一个数是根

然后我们在中序遍历中找到该根的位置

这个根前面的所有数构成根的左子树

同理,这个根后面的所有数构成根的右子树

注意到树的性质是非常强的

当我们删去根节点的时候,一棵树会分裂为两棵子树

然后我们就把一个规模较大的问题转化了规模较小的问题

显然分治捏

具体地,我们在中序遍历和后序遍历上维护这个不断更新的根

什么情况分治结束

自然是到叶子结点时停止操作

然后就差不多了

代码

#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
inline int find(char c){
    for(int i=0;i<s1.length();i++){
        if(s1[i]==c){
        	return i;
		}
    }
}
inline void dfs(int l1,int r1,int l2,int r2){
    int mid=find(s2[r2]);
    cout<<s2[r2];
    if(mid>l1){
		dfs(l1,mid-1,l2,r2-r1+mid-1);
	}
    if(mid<r1){
		dfs(mid+1,r1,l2+mid-l1,r2-1);
	}
	return; 
}
int main(){
    cin>>s1>>s2;
    dfs(0,s1.length()-1,0,s2.length()-1);
    return 0;
}

后记

好讨厌元旦联欢会

完结撒花!

posted @ 2024-12-31 17:08  sunxuhetai  阅读(8)  评论(0)    收藏  举报