@java 블루 브릿지 컵 그룹 B 알고리즘 훈련 기사 (241) (27) 질문 : 연방 수사 국 (FBI) 및 이진 트리

키워드 : 이진 트리 탐색, 재귀, 자전거 타기

문제 설명

우리는 세 가지 범주로 구성된 "0"과 "1"의 문자열을 넣을 수 있습니다 : B라고 모두 "0"문자열 문자열 모두 "1"순서라고 I 문자열을 모두 "0"을 포함하고 "1"포함 F 문자열 문자열이라고합니다.
  FBI 나무는 또한 노드 타입 F, B 노드 포함 노드가 나는 3 노드, 이진 트리입니다. 재귀 구성된 트리 FBI T를 구성 할 수있는 "01"문자열 S의 길이 2N이 아니라 다음과 같다 :
  1) 루트 노드 R, 동일한 유형 및 스트링 S의 타입 T].
  2) 문자열 S가 있다면 도 1은 중앙에서 갈라 S 문자열의 길이와 동일한 길이 S1 및 S2의 좌우측 서브 스트링들로 분할되는보다 큰, T1은 R 구성 S2 T2의 우측 서브 트리 오른쪽 스트링으로 S1을 서브 스트링 좌측 서브 트리 구조 R 왼쪽.
  지금 2N의 길이를 소정의 「01」시리즈, 상술 한 FBI 트리 공법 및 출력이 postorder 순회 시퀀스를 생성.
입력 포맷
  제 1 라인의 정수 N (0 <= N <= 인 10), 길이 2N의 두번째 줄은 "01"시리즈이다.
출력 형식
  만 문자열, 즉 이후 FBI 트리 탐색 순서를 포함 선 포함.
샘플 입력
. 3
10,001,011
샘플 출력
IBFBBBFIBFIIIFF의
데이터 사이즈와 규칙
  40 %, N의 데이터 <= 2,
  모든 데이터, N <= 10.
  참고 :
  [1] 이진 : 바이너리 트리 노드의 유한 집합이다, 집합은 공집합이거나, 또는 루트와 두 개의 분리 된 진 구성으로 구성되어 있습니다. 이 두 개의 분리 된 이진 트리 왼쪽 하위 트리과 오른쪽 서브 트리의 루트라고합니다.
  [2] 선주문 후 : postorder 순회 이진 트리의 깊이 우선 탐색하는 방법으로서, 그 재귀 정의이다 : 전순은 다음 오른쪽 서브 트리를 postorder 통과 루트 마지막 액세스를 서브 트리를 남겼다.

코드 섹션 :

이 질문은, 내가 아무것도 잘못이 있다면 나는 당신을 이해 중 일부는 나를 볼 수 있도록 추가 할 수있는 위치에 있어야합니다, 하, 하, 흰색 매춘부라고 할 수 있습니다, 답변을 찾을 나중에 인터넷에서, 이해가 안 돼요 시작에 불과합니다 그래, 하, 하, 하, 감사 당신은 내게 아 수정 ! ! ! ! ! ~~


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
	}
}

게시 29 개 원래 기사 · 원 찬양 한 · 전망 1089

추천

출처blog.csdn.net/DAurora/article/details/105169177