P1087 FBI树

#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

 代码

 

posted @ 2020-05-16 12:14  人生有味是清欢  阅读(130)  评论(0编辑  收藏  举报