2018년 9월 8일 토요일

Java 이진탐색트리(Binary Search Tree)

우리는 자바로 이진트리를 작성해보도록 하겠다.

이진트리는 이 블로그 목록 알고리즘-> 완전이진탐색트리를 C로 정의를 해둔 내용있다.
(http://itqomcom.blogspot.com/2016/05/blog-post_31.html)

해당 내용들을 참고하면서 이해하면 될 것이다.

1. BST_Func 인터페이스 구현 (역할 : 트리의 필요기능 정의)
  1. package org.java.project.binaryTree;
  2. public interface BST_Func {
  3.    
  4.     //1) 루트의 자식인 객체하나를 생성하고 BST_Insert를 호출하여 저장시킴.
  5.     public void BST_Create(BST_Head Tree, int Data);
  6.     //2) 이진트리 전체를 탐색하여 출력함.
  7.     public void BST_Search(BST_Head Tree);
  8.     public void BST_Insert(BST_Head First, BSTNode Child, int Data); // 삽입
  9.     public int BST_Delete(BST_Head TreeNode); // 객체 지우기
  10.    
  11.     public void BST_Destroy(BST_Head Tree); // 전체제거
  12.    
  13. }

2. BinaryTree 클래스 구현 (역할 : 트리의 필요기능 메소드 정의) 
  1. package org.java.project.binaryTree;
  2. public class BinaryTree implements BST_Func{
  3.     public void BST_Create(BST_Head Tree, int Data) { // 처음생성
  4.             BSTNode ChildNode = new BSTNode(Data);
  5.             System.out.println("InsertChildNode : " + Data);
  6.             BST_Insert(Tree, ChildNode, Data);
  7.     }
  8.     public void BST_Search(BST_Head Tree) {
  9.         if(Tree.count < 1) {
  10.             System.out.println("생성된 트리가 없습니다!");
  11.             System.exit(0);
  12.         }
  13.         if(Tree.left != null) {
  14.             BST_Search(Tree.left);
  15.         }
  16.        
  17.         System.out.print(Tree.data + " ");
  18.        
  19.         if(Tree.right != null) {
  20.             BST_Search(Tree.right);
  21.         }
  22.     }
  23.     public void BST_Insert(BST_Head First, BSTNode Child, int Data) {
  24.         if(First.data < Data) { // 현재 노드보다 큰경우
  25.             if(First.right != null)
  26.                 BST_Insert(First.right, Child, Data);
  27.             else
  28.                 First.right = Child;
  29.         }
  30.         else { // 현재 노드보다 작은경우
  31.             if(First.left != null)
  32.                 BST_Insert(First.left, Child, Data);
  33.             else
  34.                 First.left = Child;
  35.         }
  36.     }
  37.    
  38.     public void BST_Destroy(BST_Head Tree) { //이진트리 전체제거
  39.         if(Tree.left != null) {
  40.             BST_Destroy(Tree.left);
  41.         }
  42.         if(Tree.right != null) {
  43.             BST_Destroy(Tree.right);
  44.         }
  45.         int removed = BST_Delete(Tree); //객체를 NULL값으로 만들어버림
  46.         System.out.println(removed + "제거완료!");
  47.     }
  48.    
  49.     public int BST_Delete(BST_Head TreeNode) { //객체하나 제거
  50.         int Removed = TreeNode.data;
  51.         TreeNode.left = null;
  52.         TreeNode.right = null;
  53.         TreeNode= null;
  54.         return Removed;
  55.     }
  56. }


3. BST_Head 클래스 구현 (역할 : 루트에 해당하는 트리의 노드)
  1. package org.java.project.binaryTree;
  2. public class BST_Head extends BinaryTree{
  3.     public BSTNode left; // 상속시키는 BSTNode클래스 타입 지정 1
  4.     public BSTNode right; // 상속시키는 BSTNode클래스 타입 지정 2
  5.     public int data;
  6.    
  7.     public static BST_Head Tree;
  8.     public static int count = 0;
  9.    
  10.     public BST_Head(int data) {
  11.         this.count++;
  12.         this.data = data;
  13.         this.left = null;
  14.         this.right = null;
  15.     }
  16.    
  17. }


4. BSTNode 클래스 구현 (역할 : 루트노드의 자식에 해당하는 노드)
  1. package org.java.project.binaryTree;
  2. public class BSTNode extends BST_Head{
  3.    
  4.     public BSTNode(int data) {     
  5.         super(data);
  6.     }
  7. }



5. 메인함수 실행 (역할 : 이진트리를 실행시킴)

package org.java.project.binaryTree;

public class BinaryTreeExecute {
public static void main(String[] args) {
System.out.println("BinarySearchTree\n");
BST_Head Tree = new BST_Head(5);
System.out.println("Tree Root : 5");
Tree.BST_Create(Tree, 4);
Tree.BST_Create(Tree, 6);
Tree.BST_Create(Tree, 10);
Tree.BST_Create(Tree, 2);
Tree.BST_Create(Tree, 7);
Tree.BST_Create(Tree, 3);
System.out.println("\nBST Count : " + Tree.count);
Tree.BST_Search(Tree);
System.out.print("\n\n\n");
System.out.println("Destroy BinaryTree!");
Tree.BST_Destroy(Tree);
}
}

▶ 실행결과







: 루트노드는 BST_Head클래스에서 인스턴스화 하여 구현되고, 트리의 자식 노드들은 BST_Head클래스를 상속받는 BSTNode에서 인스턴스화 되어진다.






댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...