#include<stdio.h>
#include<math.h>
char A[1025];
void work(int low, int up)
{
int mid = (low+up)/2;
if (low!=up){
work(low, mid);
work(mid+1,up);
}
int i,a=0,b=0;
for (i=low;i<=up;i++)
if (A[i]=='0') a++;
else b++;
if (a&&b) printf("F");
else if (a) printf("B");
else printf("I");
}
int main()
{
int n;
scanf("%d", &n);
scanf("%s", A+1);
work(1, pow(2,n));
return 0;
}
算法
二分
思路
递归即可。跟二分查找的思想有点像。想起以前学长跟我说的,很多树的题目事实上根本不用把树建立出来,虽然当时觉得这个思想很惊奇,但现在自己也算真正的理解了这句话了。
树的遍历
前序
preOrderParse(int n) {
if(tree[n] == NULL)
return ; // 如果这个节点不存在,那么结束
cout << tree[n].w ; // 输出当前节点内容
preOrderParse(tree[n].leftChild); // 递归输出左子树
preOrderParse(tree[n].rightChild); // 递归输出右子树
}
中序
inOrderParse(int n) {
if(tree[n] == NULL)
return ; // 如果这个节点不存在,那么结束
inOrderParse(tree[n].leftChild); // 递归输出左子树
cout << tree[n].w ; // 输出当前节点内容
inOrderParse(tree[n].rightChild); // 递归输出右子树
}
后序
pastOrderParse(int n) {
if(tree[n] == NULL)
return ; // 如果这个节点不存在,那么结束
pastOrderParse(tree[n].leftChild); // 递归输出左子树
pastOrderParse(tree[n].rightChild); // 递归输出右子树
cout << tree[n].w ; // 输出当前节点内容
}
见https://www.cnblogs.com/z-x-y/articles/10004938.html