キーワード:バイナリツリートラバーサル、再帰、サイクリング
問題の説明
私たちは、「0」の文字列を置くことができ、「1」は三つのカテゴリーからなる:Bと呼ばれるすべての「0」の文字列の文字列、I列と呼ばれる、すべての「1」配列は、「0」と「1」が含まれ、両方が含まれていますFは、文字列の文字列と呼ばれています。
FBIツリーは二分木であり、それはまた、ノードタイプはF、B及びI三ノードノードノードが含まれます。再帰的に構築ツリーFBI Tを構築することができる「01」の文字列Sの長さ2Nには、次の通り:
1)ルートノードR、同じ種類およびストリングSのタイプのT;
2)ストリングSは、IF図1は、中央に分けS文字列の長さに等しい長さS1とS2の左右のサブストリングに分割されているよりも大きい; T1はR配置S2 T2の右サブツリー右サブストリングによって、S1をサブストリング左サブツリー構造Rによって残さ。
今2Nの長さを示す「01」シリーズは、上記1 FBIツリー構築方法、及び出力が後順トラバーサルシーケンスを構築します。
入力フォーマット
最初のラインのは、整数N(0 <= N <=である 10)、 長さ2Nの2行目「01」シリーズです。
出力フォーマット
のみ文字列を含む行、すなわち、後続のFBIツリートラバーサルシーケンスを含みます。
サンプル入力
3。
10001011
サンプル出力
IBFBBBFIBFIIIFFの
データサイズと表記
40%のデータのために、N <= 2;
すべてのデータに対して、N <= 10。
注:
[1]バイナリ:バイナリツリーノードの有限集合であり、集合は空集合であるか、または、又は根と2つの互いに素バイナリー組成物で構成されています。この2つの互いに素バイナリツリーは、左の部分木と右のサブツリーのルートと呼ばれています。
先行予約した後、[2]:後順のトラバースは、バイナリツリーの深さ優先トラバーサルのための方法であり、それは再帰的定義である:先行予約は、ルートへの最後のアクセスの右サブツリー後順トラバーサルをサブツリーを残しています。
コードセクション:
この質問は、私は何も間違っている場合、私は私はあなたを理解することのいくつかは、私が見るのを助けるために追加する立場にあるべき、ハハ、白売春婦であると言うことができる、答えを見つけるために、後でインターネット上で、どのように理解していないまだ始まったばかりですハッハッハ、ええ、あなたがああ私を修正感謝!!!!!~~
public class ALGO027 {
public static void main(String[] args) {
// TODO Auto-generated method stub
java.util.Scanner in=new java.util.Scanner(System.in);
int n=in.nextInt();
String s=in.next();
post_order(0,s.length()-1,s);
in.close();
}
//后序遍历--->递归思想
private static void post_order(int l,int r,String s){
int mid=(l+r)/2;//控制分割的位置:在字符串的正中间分割开
//先全部分割完,然后把全部结点标记之后再输出。
if(l!=r){//分割:知道r=l=0才停止分割
post_order(l,mid,s);//左子树
post_order(mid+1,r,s);//右子树
}
//设置标记判断字符
int flag1=0,flag2=0;//定义判断的变量
for(int i=l;i<=r;i++){//标记判断字符(变量)并且根据01字符串(这里的字符串是已经不可再分割的字符串)给控制输出的两个变量flag1、flag2赋上对应的值
if(s.charAt(i)=='0') flag1=1;
if(s.charAt(i)=='1') flag2=1;
}
//根据判断字符变量来输出对应的字母:B、I、F
if(flag1==1&&flag2==0) System.out.print("B");//只有0
if(flag1==0&&flag2==1) System.out.print("I");//只有1
if(flag1==1&&flag2==1) System.out.print("F");//既有0又有1
}
}