import java.util.ArrayDeque;
import java.util.Queue;

public class CompleteBinaryTree<T> { //완전이진트리 탐색
	
	private Object[] nodes;//(어떠한 타입의 데이터라도 허용하는)노드를 담을 배열 선언
	private int lastIndex; //마지막추가된 노드의 인덱스 정보
	private final int SIZE; //배열크기
	
	public CompleteBinaryTree(int size) {
		SIZE = size;
		nodes = new Object[size+1];  //0인덱스 사용 안함  ==> 인덱스와 노드번호를 일치시키기 위하여
	}
	
	//꽉찬상태 체크
    private boolean isFull() {
    	return lastIndex == SIZE;
    }
    
    //빈상태 체크
    private boolean isEmpty() {
    	return lastIndex == 0;
    }
	
	//데이터 추가
	public void add(T e) {
		
		//배열이 꽉찬 상태라면 그만!!
		if(isFull()) {
			System.out.println("포화상태입니다..");
			return;
		}
				
		nodes[++lastIndex] = e;
	}

	
	public void printTreeByPreOrder() {
		System.out.print("PreOrder :");
		printTreeByPreOrder(1); //1 ==> 루트노드
		System.out.println();
	}
	
    //전위순회(탐색) - 재귀호출 (DFS)
	private void printTreeByPreOrder(int current) { //current:부모노드!!
//		 1.current처리!
//		 2.왼쪽자식처리
//		 3.오른쪽자식처리
		
		//1.
		System.out.print(nodes[current]+" ");//현재노드 처리
		
		//2.
		if(current*2 <= lastIndex) //노드 범위내에서 재귀호출을 하자
		printTreeByPreOrder(current*2);
		
		//3.
		if(current*2+1 <= lastIndex)
		printTreeByPreOrder(current*2+1);
	}
	
	//============================= 중위 순회 ================================
	public void printTreeByInOrder() {
		System.out.print("InOrder :");
		printTreeByInOrder(1); //1 ==> 루트노드
		System.out.println();
	}
	
	//중위순회(탐색) - 재귀호출 (DFS)
	private void printTreeByInOrder(int current) { //current:부모노드!!
		 if(current > lastIndex) return;
//		 2.왼쪽자식처리
//		 1.current처리!
//		 3.오른쪽자식처리
		
		//2.
		printTreeByInOrder(current*2);
		
		//1.
		System.out.print(nodes[current]+" ");//현재노드 처리
		
		//3.
		printTreeByInOrder(current*2+1);
	}
	
//========================= 후위 순회 ===============================
	public void printTreeByPostOrder() {
		System.out.print("PostOrder :");
		printTreeByPostOrder(1); //1 ==> 루트노드
		System.out.println();
	}
	
    //후위순회(탐색) - 재귀호출 (DFS)
	private void printTreeByPostOrder(int current) { //current:부모노드!!
		 if(current > lastIndex) return;
//		 2.왼쪽자식처리
//		 3.오른쪽자식처리
//		 1.current처리!
		
		
		//2.
			printTreeByPostOrder(current*2);
		
		//3.
			printTreeByPostOrder(current*2+1);
		
		//1.
		System.out.print(nodes[current]+" ");//현재노드 처리
	}
	
	//큐를 통한 탐색 ==> BFS 탐색
	public void bfs() {
		Queue<Integer> queue = new ArrayDeque<Integer>();
		
		queue.offer(1);//루트노드가 시작점!!
		int current;
		
		while(!queue.isEmpty()) {//자식노드 추가!!
			current = queue.poll();
			
			//노드처리
			System.out.println(nodes[current]);
			
			//대기열에서 빠진 노드 정보를 가지고 == 자식 노드들 얻어오기 *2,  *2+1
			if(current*2 <= lastIndex)queue.offer(current*2); //왼쪽자식
			if(current*2+1 <= lastIndex)queue.offer(current*2+1);//오른쪽자식
			
		}
		
	}
	
}

'코딩테스트' 카테고리의 다른 글

SORT 정리 / ArrayTesr  (0) 2025.04.12
NextPermutation  (0) 2025.04.12
백준 - 1158 번 요세푸스  (0) 2025.04.11
백준 - 10845번  (0) 2025.04.11
QueueArray  (0) 2025.04.10

+ Recent posts