#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