问题描述

  我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

  FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

  1)T的根结点为R,其类型与串S的类型相同;

  2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

  现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。





输入格式

  第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。

输出格式

  包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。





样例输入

3

10001011

样例输出

IBFBBBFIBFIIIFF





数据规模和约定

  对于40%的数据,N <= 2;

  对于全部的数据,N <= 10。

  注:

  [1] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。

  [2] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。

法一:直接递归

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<algorithm>
  5. using namespace std;
  6. string str;
  7. void fbi(int l,int r)
  8. {
  9. if(l>r)
  10. return ;
  11. int mid=(l+r)/2,B=0,I=0;
  12. if(l!=r){
  13. fbi(l,mid);
  14. fbi(mid+1,r);
  15. }
  16. while(l<=r)if(str[l++]=='0')B++;else I++;
  17. if(B!=0&&I!=0) printf("F");
  18. else if(I!=0&&B==0)printf("I");
  19. else printf("B");
  20.  
  21. }
  22. int main ()
  23. {
  24. int n;
  25. scanf("%d",&n);
  26. cin>>str;
  27. fbi(0,(int)str.size()-1);
  28. printf("\n");
  29. return 0;
  30. }

法二:建树

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. char s[2000],r[2800];
  6. void build_FBI(int k,int left,int right)//k=结点
  7. {
  8. if(left==right)//如果长度为一,则是一则一,是零则0;
  9. {
  10. r[k]=s[right];
  11. return;
  12. }
  13. int mid=(left+right)/2;
  14. build_FBI(2*k,left,mid);
  15. build_FBI(2*k+1,mid+1,right);
  16. if(r[2*k]=='0'&&r[2*k+1]=='0')r[k]='0';
  17. else if(r[2*k]=='1'&&r[2*k+1]=='1')r[k]='1';
  18. else r[k]='2';
  19. }
  20. void dfs(int v){//后序遍历
  21. if(r[2*v])
  22. dfs(2*v);
  23. if(r[2*v+1])
  24. dfs(2*v+1);
  25. if(r[v]=='0')
  26. printf("B");
  27. else if(r[v]=='1')
  28. printf("I");
  29. else
  30. printf("F");
  31. }
  32. int main()
  33. {
  34. int n;
  35. scanf("%d",&n);
  36. scanf("%s",s+1);//从1开始
  37. build_FBI(1,1,(int)strlen(s+1));
  38. dfs(1);
  39. printf("\n");
  40. }

1058FBI<二叉树,递归,后序遍历>的更多相关文章

  1. 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】

    [145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...

  2. lintcode:Binary Tree Postorder Traversal 二叉树的后序遍历

    题目: 二叉树的后序遍历 给出一棵二叉树,返回其节点值的后序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [3,2,1] 挑战 你能使用非递归实现么? 解题: 递归程序 ...

  3. LintCode-68.二叉树的后序遍历

    二叉树的后序遍历 给出一棵二叉树,返回其节点值的后序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [3,2,1] 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 code / ...

  4. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  5. 【遍历二叉树】03二叉树的后序遍历【Binary Tree Postorder Traversal】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,返回他的后序遍历的 ...

  6. leecode刷题(30)-- 二叉树的后序遍历

    leecode刷题(30)-- 二叉树的后序遍历 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 思路 ...

  7. Java实现 LeetCode 145 二叉树的后序遍历

    145. 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成 ...

  8. Leetcode(145)-二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 思路:一开始编写二叉树后序遍历的程序,感觉定级为困难有点欠妥,确实,如果用 ...

  9. 【LeetCode】145. 二叉树的后序遍历

    145. 二叉树的后序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给定一个二叉树的根节点 root ,返回它的 后序 遍历. 示例 输入: [1,null,2,3] 1 \ 2 / 3 输 ...

  10. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

随机推荐

  1. android抓日志

    1. adb logcat -c 清楚以前的日志 adb logcat -s 过滤 adb logcat -s *:E adb logcat -v 指定输出的格式 adb logcat -v brie ...

  2. [转载]C#控制台应用程序里调用自己写的函数的方法

    (2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...

  3. KMP算法类习题——字符串匹配

    Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p- ...

  4. Entity Framework技巧系列之十一 - Tip 42 - 45

    提示42. 怎样使用Code-Only创建一个动态模型 背景: 当我们给出使用Code-Only的例子,总是由创建一个继承自ObjectContext的强类型的Context开始.这个类用于引导模型. ...

  5. mysql中AES_ENCRYPT、AES_DNCRYPT及CONVERT的用法

    这两天在弄公司的服务端项目的时候,发现mysql比较实用的3个函数,在这里给大家分享一下. 1.AES_ENCRYPT函数,这个函数的使用场景是对一些安全性要求比较高的数据使用AES加密,语法为: A ...

  6. Thinkphp与Ucenter整合笔记

    ucenter手册:http://www.phpddt.com/manual/ucenter/html/index.htm 参考:http://www.thinkphp.cn/topic/1557.h ...

  7. 一篇很全面的freemarker教程 前端工程师必备

    FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...

  8. 删除sql计划 调用的目标发生了异常。 (mscorlib) 其他信息: 用户 'sa' 登录失败。

    在删除以前创建的sql的计划任务时,弹出如题错误提示,发现错误原因在于,sa密码更改过,导致在删除时因为sa的密码和当前的密码不正确出现此错误. 解决办法: 1.在计划任务的编辑窗口,找到管理连接 2 ...

  9. code.google.com

    https://github.com/couchbase/sync_gateway/issues/492 This list shows the current base import paths, ...

  10. hash随笔

    hash属性是一个可读可写的字符串,是url的锚部分(从#开始).多用于单页面应用中,使其包含多个页面. 定位:通过id来定位 eg: <div id= "part1"> ...