NetEase는 : 수준 이진 트리 탐색

제목 설명

계층 이진 트리 탐색 
자바 트리 구조, 계층 이진 트리 탐색을 사용. 이진 트리의 시퀀스 주어 진 트리 순회 계층 위에서 아래로, 즉, 이진 트리 액세스 레벨 (각 개별 라인의 출력 레벨)을 필요로 각 층에 대한 액세스 요구로부터, 우측 후 동일한 규칙을 남겨 트리 노드에서 다시 하단까지 순회는 다음과 같이 정의되는 
클래스 {노드
 INT에서 , 데이터 
노드 왼쪽, 
상기 노드 오른쪽 
} 
입력 설명 
:도 
        __1__
        /      \ 
    __2__ 3__
    /      \ \
   4 __5__ 6. 
       7.8. 
입력 이상 : 1, 2, 3, 4, 5, 0, 6, 0, 0, 7 , 8 주 : 0이된다는 위치 번호, 데이터 길이를 024 개 이하를 의미한다. 
정보 출력 
순방향 및 역방향 이진 출력 레벨에 따른, 광고의 출력단에는 공간 주석이없는 
실시 예 1 
입력
 1, 2, 3, 4, 5, 0, 6, 0, 0, 7, 8 개, 
출력
 1 
2 3 
4 5 6 
7 8 

. 제 7 
. 4. 5. 6
3 2 
1

 

코드

수입 인 java.util.ArrayList;
수입 되는 java.util.LinkedList;
수입 은 java.util.List;
수입 java.util.Queue;
수입 java.util.Scanner;
클래스 노드 {
     INT의 발; 
    노드 왼쪽; 
    노드 권리; 
    공개 노드 ( INT의 발) {
          .val = 브로; 
    } 
} 
공용  클래스 A1 {
     공공  정적  무효 메인 (문자열 []에 args) { 
        스캐너 SC = 새로운 스캐너 (System.in); 
        문자열 [] str을sc.nextLine = () 스플릿 ( "." );
        INT LEN = str.length;
        값 int [] 데이터 = 새로운  INT [렌]을;
        위한 ( int로 ; 나는 LEN <I는 I = 0 ++ ) { 
            데이터 [I] = Integer.valueOf (STR [I]); 
        } 
        노드 루트 = CREAT (데이터); 
        목록 <리스트 <정수 >> 결과 = levelorder (루트);
        위한 ( int로 I = 0; I)이 (result.size를 <; 내가 ++ ) {
              ( INT의 J = 0; J <result.get (I)의 크기는 (); J ++ ) {
                System.out.print (result.get (I) 갔지 (j) + "" ); 
            } 
            에서 System.out.println (); 
        } 
        에서 System.out.println (); 
        위한 ( int로 난을 result.size = () - 1] I> = 0; 난 ... ) {
              ( INT의 J = 0; J <result.get (I)의 크기는 (); J ++ ) { 
                System.out을한다. 인쇄 (result.get (I) 갔지 (j) + "" ); 
            } 
            에서 System.out.println (); 
        } 
    } 
    공용  정적 노드 CREAT ( INT [] OBJS) { 
        ArrayList를 <노드> = datas새로운 새로운 ArrayList를 <노드> ();
         //         값이 배열 순서 노드 노드로 변환되고, 
         ( INT의 O : OBJS) { 
            datas.add ( 새로운 신규 노드 (O)); 
        } 
        // 제 번호는 루트 인 
        노드 = datas.get 루트 (0 );
         // 이진 트리 
        에 대한 ( int로 I = 0; 나는 objs.length / 2 <; 내가 ++ ) {
             // 왼쪽 아이 
            IF (datas.get (I + 2 * 1) .val.! = 0 ) { 
                datas.get (I) .left = datas.get (I + 2 * 1. ) 
            } 
            // 오른쪽 아이 
            하다면((I *가 + 2) <datas.size () && datas.get (I .val는 2 + 2) *! = 0) { // 회피 짝수 경계 때 첨자 
                datas.get (I) = 됐지 datas.get (I는 2 + 2 * ) 
            } 
        } 
        복귀 루트; 
    } 
    
    공용  정적 리스트 <일람 <정수 >> levelorder (노드 노드) {  <노드를> 큐 = 새로운 새 LinkedList의 <> () 
        에서 <목록 <정수 결과 = >> 새로운 새로운 ArrayList를 <> (); 
        Queue.offer (노드); // 첫 번째 루트 루트가 대기열에 
        그동안를 (! queue.isEmpty ()) { // 큐가 비어 있지, 루프 
            목록 <정수>노드 =새로운 새로운 ArrayList를 <> (); //는 각 계층의 노드에서의 값을 저장 
            INT의 길이 = queue.size을 (); // 각 계층의 노드 번호 
            그동안 (길이> 0 ) { 
                노드 트리 = queue.poll ();
                 IF (! = tree.left ) { 
                    Queue.offer (tree.left) 
                } 
                IF (tree.right =! ) { 
                    Queue.offer (tree.right) 
                } 
                node.add (tree.val) 
                길이 - - ; 
            } 
            //사이클 후, 생성 층이 다음 큐, 현재 레이어의 결과를 통해 노드 제조 
            ; result.add (노드) 
        } 
        리턴 ; 결과 
    } 
}

 

추천

출처www.cnblogs.com/haimishasha/p/11370583.html