题解
2026-10-07 14:06:13
发布于:广东
4阅读
0回复
0点赞
- 后序遍历的最后一个字符,是当前树的根结点。前序遍历先打印根。
- 在中序序列找到根的位置,根左边全部字符属于左子树,右边全部属于右子树。左边字符的数量就是左子树节点个数
len。 - 根据左子树节点数
len,把后序序列切分成:前len个字符(左子树后序),中间一部分(右子树后序),最后一个是根。 - 左子树的根 = 左子树后序片段的最后一个字符;右子树根 = 右子树后序片段的最后一个字符。
- 递归处理左子树,再递归处理右子树。
- 递归终止条件:子树字符串长度等于 1(叶子结点)直接返回。
小提醒
代码里每一处if(长度>0)判断,是为了防止substr访问越界崩溃。
#include<bits/stdc++.h>
using namespace std;
string sz,sh;
//std::string sub = s.substr(pos, len);
void f(string s1,string s2,char root){
cout<<root;
if(s1.size()==1){
return;
}
int len=0;
for(int i=0;i<s1.size();i++){
if(s1[i]==root) break;
len++;
}
string z1,z2,y1,y2;
if(len>0) z1=s1.substr(0,len);
if(len>0) z2=s2.substr(0,len);
if(s1.size()-len-1>0) y1=s1.substr(len+1,s1.size()-len-1);
if(s2.size()-len-1>0) y2=s2.substr(len,s2.size()-len-1);
if(z1.size()>0) f(z1,z2,z2[z2.size()-1]);
if(y1.size()>0) f(y1,y2,y2[y2.size()-1]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>sz>>sh;
f(sz,sh,sh[sh.size()-1]);
return 0;
}
不太美观,勿喷
这里空空如也




有帮助,赞一个