데이터 구조 - 나무 (자바 기술 언어)

 

 

  1. 루트 : rootNode를 단지 트리 루트.
  2. 노드 :. 노드 모두는 나무에 노드.
  3. 자식 노드의 배열은 : 노드 [] 배열은 각 노드의 모든 자식 노드를 나타낸다.
  4. 부모 :. 인 parentNode 각 노드는 하나의 부모가.

내부 클래스 2. 노드 트리

  1. 부모 : 부모 노드로 기준점
  2. childern : 아이 배열은 해당 노드의 모든 자식 노드를 저장합니다.
  3. T는 일반적인 매개 변수의 데이터 유형을 저장해야하는지의 노드 대표, 노드는 데이터 필드입니다.
  4. 크기 : 모든 노드의 아이의 수입니다. (어레이의 모든 요소의 아이의 수)

3.Tree 클래스 (트리 내부 루트 노드 A를 유지 트리 CRUD 구현 클래스입니다.)

나무 뿌리 : 나무는 루트 노드의 유지 보수를 실시하고 있습니다.

CUR : 기준 전류를 나타내는 노드는, 다양한 방법은 공간 복잡도를 감소시킨다.

DEFAULT_SIZE : 자식 노드 배열의 기본 크기 (10)의 값입니다.

findNodes () :이 메소드는 현재 노드의 자식 노드의 배열을 반환합니다.

찾기 () 메소드가 트리 노드를 탐색하고 현재 노드의 작동 기능을 제공하기위한 노드 트리 참조 기능에 구현되어 돌아갑니다.

()에 추가 :이 방법은 달성에 노드를 추가하기 위해 내부적으로 동적 확장 노드 어레이 부모 노드를 찾을 찾기 () 및 addNode 명 () 메소드를 호출.

아이디어 3. 실현 :

코드 1 : 트리 클래스를 구축 할 수 있습니다. 이러한 시퀀스 내부 보수 트리 기반 삭제 트리 변화 조사 외부에 제공. 코드는 전체 트리 구조의 셀들로 구성된다.

@SuppressWarnings (값 = "모든" )
 공공  클래스 트리 <T> {

    // 트리 생성자는 구성하는 나무 뿌리 
    공공 트리 () {
        나무 뿌리는 = 새로운 노드 ();
    }
    // 트리 기반의 배열

    // 의 아이 배열의 기본 초기 크기 
    정적  INT DEFAULT_SIZE = 10 ;

    // 뿌리, 트리 객체는 객체를 유지하기위한 책임이 있습니다. 
    개인 노드 나무 뿌리;

    // 현재의 잎 포인터를 가리키는 
    개인 노드 CUR;

    // 내부 노드 클래스, 트리 구조의 기본 단위. 
    정적  클래스 노드 <T> {

        // 아이들 배열의 요소 수 
        전용  의 INT 0 = 크기를 ;

        // 부모 노드 포인터 
        개인 노드 <T> paraent;

        전용 노드 <T> [] = 아이 노드 [DEFAULT_SIZE];

        // 잎 데이터 필드 
        개인 T T;

        // 잎 이름 
        개인 문자열 이름;

        // 노드 외부는 두 개의 생성자 루트 요소, 리프 노드를 구축하기위한 책임이있는 다른 요소를 구성하는 데 사용되는 매개 변수가없는 생성자를 제공합니다. 
        공공 노드 () {
             다음은이 .name을 = "루트" ;
        }

        공공 노드 (T의 t, 문자열 이름) {
              .T = t;
             .name을 = 이름;
        }
    }

}

코드 2 : 달성하는 방법을 추가

포인터 기준 노드에 전달 // 메소드 필요

공개  공극 추가 (노드 <T> 노드) {
 // () 호출은 현재의 동작 노드를 찾을 수있는 방법과, 상기 노드의 하위 배열에 addNode 명 ()을 가산함으로써있어서 찾는 
        노드의 부모 = (찾기);
        addNode 명 (상위 노드);
}

발견 () 코드 쿼리 작업 트리의 방법 :: 3로 구현하는 방법을 얻을 수 있습니다.
(코드 A는 내가 약간의 현기증을 쓸 때, 긴 비트,하지만 당신은 훨씬 쉽게있을 수 있습니다 파일의 작업을 이해하는 클립 상상 ~)

공공 노드 <T> 찾기 () {
         // 현재 노드는 노드 루트 될 수 있도록 
        노드 CUR = 나무 뿌리;
        스캐너는 스캐너 = 새로운 스캐너 (System.in)를;
        
        // 식별, 사용자 조작 문자열 
        문자열에서 깃발 = 널 (null) ;
        
        // 인덱스 변수 어레이의 노드 식별 
        INT의 인덱스 = 0 ;

        // 수신하는 현재의 노드 어레이의 자식 
        노드를 [] = 노드 ;
        
        // 필요 순환 조건에서 동작 노드를 선택하기 위해 
        그동안 ( true로를 {)        
            에서 System.out.println ( "현재 부모 노드 :"+ cur.name);
            에서 System.out.println는 ( "현재 노드는 자식 노드를 통과 계속할지 여부를 추가하거나입니까?"); // 
            // (PS :. 1을 눌러 현재 노드의 반복 처리 아이들에게, 현재 파일의 리프 노드에 현재 노드에서 2를 눌러 꽤입니다 ) 파일 폴더를 추가하거나 하위 폴더를 입력 
            깃발 = scanner.nextLine을 ();
             // 1을 선택하면, 현재 노드의 아이의 배열을 통과. 
            IF ( ". 1"flag.equals ( )) {
                 // finjNodes ()에있어서 현재 노드의 자식 노드의 배열을 얻었다 
                노드 = findNodes (CUR)를;
                 // 배열의 요소의 개수가 0이면, 조작 완료인지 . 
                IF (cur.size == 0 ) {
                        에서 System.out.println ( "자식 노드,이 삽입 끝!" );
                         반환  널 (null) ;
                }
                // 0이 아닌 모든 자식 노드의 다음 출력이 아닌 경우 널 
                 ( INT I = 0; I <nodes.length; I ++ ) {
                     IF (! 노드 [I] = )
                        System.out.print (노드 [I] .name을 + "("+ I + ")"+ "" );
                }
                //이 동작하는 노드 선택 
                ( "(노드를 선택 추신 : 선택) 괄호의 첨자 따르면"에서 System.out.println를 )
                 // 동작 동안 반복 대신 try 블록 중보다 사용자 입력 문자 숫자를 방지 할 수있다. 
                그동안 ( true로 ) {
                     은 try {
                        인덱스 = Integer.valueOf (scanner.nextLine ());
                        CUR = 노드 [인덱스];
                        경우 (현재 == ) {
                            에서 System.out.println ( "노드가 다시 시도하십시오 존재하지 않습니다" );
                             (가) 계속 ;
                        }
                        휴식 ;
                    } 캐치 (예외 전자) {
                        에서 System.out.println ( "입력 첨자 형식이 올바르지 않습니다, 제발 다시 입력!" );
                    }
                }
            }
            // (1)는, 현재 노드가 반환되지 않습니다. 
            다른 {
                 / ** 은 try {
                    
                } 드디어 {
                    //System.out.println는 ( "OFF 흐름");
                    //scanner.close () 여기서, 근접 스트림은 다음이 메서드를 호출하는 예외를 발생 대신 ??
                }
                * /
                에서 System.out.println ();
                반환 CUR을;
            }
        }
    }

코드 4 : addNode 명 () 방법 :

// 부모 노드와 자식 노드 포인터 전달이 방법 
공공  무효 addNode 명 (노드 <T> 부모, 노드 <T> 노드) {
         // 부모 노드가 null가 아닌 경우     
        경우 (부모! = ) {
             // GET 부모의 수가 모든 어린이 
            INT 크기 = parent.size;
             // . 추가 용량이 필요한지 여부를 확인하는 원소를 첨가하기 전에 enSureSize () 메소드를 호출 
            enSureSize을 (크기 + 1 , 부모)
             // 부모 노드 소자 추가 
            parent.children을 [크기] = 노드;
            parent.size ++ ;
        }
}

코드 5 : enSureSize () 메소드. 동적 확장을 달성하는 방법) (gorw 호출 할 필요가 있는지 확인

공공  무효 enSureSize ( INT minCapcity, 노드의 부모) {
         // 부모 노드 현재 minCapcity의 모든 아이들의 수는 기본 크기와 자녀의 수 많은 수의 사이에서 선택 
        minCapcity = Math.max (DEFAULT_SIZE의, minCapcity);
         // 경우 아이의 수 성장이라고, 배열의 현재 길이를 초과 (방법) 
        IF (minCapcity - parent.children.length> 0 )
            (minCapcity, 부모) 성장;
    }

코드 6 : 성장한다 () 메소드 .. 0.5 배 배열 용량 증가를 달성 또는 전체 어레이를 복사한다.

공개  보이드 성장 ( INT minCapcity, 노드 <T> 부모) {
         // 어레이의 최대 길이를 제한하는 
        IF (minCapcity>는 Integer.MAX_VALUE를 -. 8 ) {
            System.out.print 중 ( "배열의 길이는 최대 길이 제한을 초과" );
             반환 ;
        }
        노드 [] arrys = parent.children;
        INT oldLength = arrys.length,는 newLength;
        는 newLength = oldLength + ( INT ) (* oldLength 0.5); // 0.5 배 확장
         // 수가 새로운 배열의 길이보다 큰 경우, 상기 어레이의 새로운 길이의 자식 수 
        IF (minCapcity> 는 newLength)
            는 newLength = minCapcity;
         // 배열 효율적인 복사에 의해 제공되는 원시 메소드 어레이 툴. 
        = parent.children Arrays.copyOf (arrys 상기는 newLength);
    }

코드 7 : 나무 (10)의 루프 노드의 주요 기능을 구현

공공  정적  무효 메인 (문자열 []에 args) {
         //이 형식 문자열 트리 인스턴스화     
        트리 <문자열> 트리 = 새로운 새 트리 <문자열> ()
          ( INT ; I <10 I ++ I = 0 ) {
             / / , + 나는 잎은 이름이 "노드"임의의 숫자를 열 데이터 도메인 (0-10)를 생성 
            tree.add ( 새로운 새로운 "+ (노드 (" 지능 ) *) () (10) 인 Math.random ( "노드" + I));
        }
    }

5. 설명 :
이 알고리즘의 동작 때문에, 시간과 개인 능력의 복잡하고 각 쿼리가 부모 노드, 신발은 코드 수정에 관심이있을 수의 위치로 돌아 오지 때문에 나무가 결함이 ~~~~~

6. 요약이 :
이 문서는 나무가 구조의 일종 방법을 상상하는 자신의 관점을 기반으로, 그것은 방법의 종류는 우리가 더 나은 구조와 나무를 이해할 수있는 파일 시스템을 통해 실제로 방법에 의한 일련의 작업을 수행 할 수 있습니다. 예컨대 나무 잎의 하위 폴더에 해당 트리의 루트 같은 창문으로 디스크 드라이브와 같은 기본 작업. 드라이브를 바탕으로 우리는 파일, 폴더를 많이 만들 수 많은 폴더를 넣을 수 있습니다 ... 단지 당신이 쿼리 및 운영 노드를 증가시킬 수 있지만, 그러나 나는 파트너로 find () 메소드에의 기초 노드 수 있었다 믿는다 실현 삭제 및 업데이트 작업 (바이너리와 균형 이진의 지속적인 후속 요약
트리). ----------------
저작권 :이 문서에는, 원래 기사 CSDN 블로거 "Mrjianghaokun을"이고 따라 CC 4.0 BY-SA 저작권 계약, 원본 소스 링크이 문을 첨부 해주세요 재현.
원본 링크 : HTTPS : //blog.csdn.net/Mrjianghaokun/article/details/99708541

추천

출처www.cnblogs.com/fdy-study-consist/p/12185328.html