嗨嗨嗨,我来啦~~~
个人感觉你的代码太繁琐了,不用这么写
首先明确:
先序:根-左-右;
中序:左-根-右;
后序:左-右-根;
可以发现,在中序的三个节点中,根在后序中排在最后。所以我们的思路就出来了:
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