- 루트 : rootNode를 단지 트리 루트.
- 노드 :. 노드 모두는 나무에 노드.
- 자식 노드의 배열은 : 노드 [] 배열은 각 노드의 모든 자식 노드를 나타낸다.
- 부모 :. 인 parentNode 각 노드는 하나의 부모가.
내부 클래스 2. 노드 트리
- 부모 : 부모 노드로 기준점
- childern : 아이 배열은 해당 노드의 모든 자식 노드를 저장합니다.
- T는 일반적인 매개 변수의 데이터 유형을 저장해야하는지의 노드 대표, 노드는 데이터 필드입니다.
- 크기 : 모든 노드의 아이의 수입니다. (어레이의 모든 요소의 아이의 수)
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