FBI树 解析来噜~~


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.调试 (它不在我的字典里

1 个赞

你这属于部分AC代码吗?

这是题解,不算

哦。。。

第一次来常规区

image
并非题解不算,而是没有太过于接近

嗯。

1 个赞

题解要放经验分享区

好的