萝啵啵是一个从C语言入手,还不太会用C++里string的萝卜,下面是不用string的解析(第一次写题解啵啵啵
,有误请告诉啵啵捏,谢谢大家)
#include <bits/stdc++.h>
using namespace std;
const int N=1e3;
int len;
char a[N],b[N],c[N];//a是用数组模拟的二叉树;b,c分别为二叉树中,后序遍历
//建立好树后按先序打印
void x(int i)
{
if(a[i]==0) return;
cout<<a[i];//根
x(2*i);//左
x(2*i+1);//右
return;
}
using namespace std;
const int N=1e3;
int len;
char a[N],b[N],c[N];//a是用数组模拟的二叉树;b,c分别为二叉树中,后序遍历
//建立好树后按先序打印
void x(int i)
{
if(a[i]==0) return;
cout<<a[i];//根
x(2*i);//左
x(2*i+1);//右
return;
}
//l,r是和后序数组下标对应的,在中序无效;node是新的根节点序号
void tree(int l, int r, int node){
if(r<l) return;
a[node]=c[r];int i,j,k;
if(r==l) return;
//i,k是为了找到接下来要递归的左区间和右区间长度 ,而这个要用中序去确定
//找到当前子树中序区间里,最靠前的那个后序l,r区间内出现的元素(那我再找根节点在中序的绝对位置就知道接下来要递归左区间右区间长度啦
for(i=1;i<=len;i++){
int s=0;
for(j=l;j<=r;j++)
{
if(b[i]==c[j]) s=1;
}
if(s) break;
}
//找到根在中序中的位置
for(k=1;k<=len;k++){
if(b[k]==a[node]) break;
}
//递归建左右子树
tree(l,l+k-i-1,2*node);
tree(l+k-i,r-1,2*node+1);
return;
}
int main()
{
scanf("%s",b+1);
scanf("%s",c+1);
len=strlen(b+1);
tree(1,len,1);
x(1);
return 0;
}
void tree(int l, int r, int node){
if(r<l) return;
a[node]=c[r];int i,j,k;
if(r==l) return;
//i,k是为了找到接下来要递归的左区间和右区间长度 ,而这个要用中序去确定
//找到当前子树中序区间里,最靠前的那个后序l,r区间内出现的元素(那我再找根节点在中序的绝对位置就知道接下来要递归左区间右区间长度啦
for(i=1;i<=len;i++){
int s=0;
for(j=l;j<=r;j++)
{
if(b[i]==c[j]) s=1;
}
if(s) break;
}
//找到根在中序中的位置
for(k=1;k<=len;k++){
if(b[k]==a[node]) break;
}
//递归建左右子树
tree(l,l+k-i-1,2*node);
tree(l+k-i,r-1,2*node+1);
return;
}
int main()
{
scanf("%s",b+1);
scanf("%s",c+1);
len=strlen(b+1);
tree(1,len,1);
x(1);
return 0;
}

京公网安备 11010502036488号