QWQ

P1030 [NOIP2001 普及组] 求先序排列

嗨嗨嗨,我来啦~~~ 个人感觉你的代码太繁琐了,不用这么写 首先明确: 先序:根-左-右; 中序:左-根-右; 后序:左-右-根; 可以发现,在中序的三个节点中,根在后序中排在最后。所以我们的思路就出来了: 1、在中序中找在后序中排在最后的节点,将其作为根节点,放入输出中; 2、在步骤1中找到根节点后,其左边的就是其左节点,右边就是其右节点; 3、将开头~根与根~结尾分别作为一个范围,然后重复上述的步骤; 代码如下: ```cpp #include<iostream> #include<cstring> using namespace std; string in1,in2,out; int len,pt; int find(int l,int r) { if(l>r) {return 0;}// 特判,防止特殊情况 int lst=0,p; for(int i=l;i<=r;i++) { for(int j=0;j<len;j++) { if(in1[i]==in2[j]) { if(j>=lst) { lst=j; p=i; } break; } } }// 查找在后序中排最后的节点 out[pt]=in1[p];// 放入输出 pt++; find(l,p-1); find(p+1,r);// 在左、右边中继续搜索 return 0; } int main() { cin>>in1>>in2; len=in1.size();// 输入并获取长度 find(0,len-1);// 开始搜索 for(int i=0;i<pt;i++) {cout<<out[i];} return 0; } ``` 如果觉得好的话,记得点个赞支持下~~~谢谢!
by AZYDLL @ 2023-07-14 12:11:52


sto,[](tlqtj,)%%%,orz,nb[](jbl,sqlm) [](t307602)
by luogu_user @ 2023-07-16 17:26:19


@[AZYDLL](https://www.luogu.com.cn/user/881733)
by luogu_user @ 2023-07-16 17:30:43


@[AZYDLL](/user/881733) 我都忘了有这题。。。 谢谢dalao
by sutianyi @ 2023-07-31 10:23:03


@[AZYDLL](/user/881733) 这里好像只有举报,没有点赞......
by riki1230 @ 2023-09-12 21:46:15


|