1.读题 题目中告诉我们全0得B,全1得I,有1有0得F
2.思路分析
(画的有点丑,勿喷
如此计算即可得到相同结果
方法:题目其实已给出
1) T的根结点为R,其类型与串S的类型相同;
2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
3.上代码!
void dfs(int l,int r){
//dfs用来判断三种可能,表示l->r字符串建树
//如果r-1>1,说明要继续走,变成dfs(l,mid); dfs(mid+1,r);
//mid为l,r的中点 mid=(l+r)/2;
//如果r-1==1,说明函数递归到了尽头,按照后序遍历输出,结束
if(l==r){ //结束条件
if(s[l]=='0') cout<<"B";
if(s[l]=='1') cout<<"I";
}
int mid=(l+r)/2; //mid表示中点
dfs(l,mid); //递归左子树
dfs(mid+1,r); //递归右子树
bool B=true; //判断是否全为0
bool I=true; //判断是否全为1
for(int i=l;i<=r;i++){ //根节点
if(s[i]=='1') B=false; //有1
if(s[i]=='0') I=false; //有0
}
if(B) cout<<'B'; //如果全为0
else if(I) cout<<'I'; //如果全为1
else cout<<'F';
}
主体深搜就是这样
主函数比较简单,只要遍历一下0到字符串长度-1就行了
4.调试 (它不在我的字典里