algorithm

CompleteBinaryTree

코드와이 2021. 2. 10. 17:30

CompleteBinaryTree

package week0208_0212;


import java.util.LinkedList;
import java.util.Queue;
/**
 * @author THKim
 */
public class CompleteBinaryTree {

	private char[] nodes;
	private int lastIndex;
	private final int SIZE;
	
	public CompleteBinaryTree(int size){
		SIZE = size;
		nodes = new char[size+1];// 0인덱스 사용 안함
	}
	
	public boolean isEmpty(){
		return lastIndex == 0;
	}
	
	private boolean isFull(){
		return lastIndex == SIZE;
	}
	
	//완전이진트리로 추가하는 방법
	public void add(char e){
		if(isFull()){
			System.out.println("포화상태입니다..");
			return;
		}
		nodes[++lastIndex] = e;
	}
	public void bfs() {
		Queue<Integer>  queue = new LinkedList<Integer>();
		
		queue.offer(1);
		int current;
		while(!queue.isEmpty()) {
			current = queue.poll();
			System.out.println(nodes[current]);
			if(current*2<=lastIndex) queue.offer(current*2);
			if(current*2+1<=lastIndex) queue.offer(current*2+1);
		}		
	}
	public void bfs2() {
		Queue<Integer>  queue = new LinkedList<Integer>();
		
		queue.offer(1);
		int current,size,level=0;
		while(!queue.isEmpty()) {
			
			size = queue.size();
			System.out.print("level"+level+" : ");
			while(--size>=0) {
				current = queue.poll();
				System.out.print(nodes[current]+"\t");
				if(current*2<=lastIndex) queue.offer(current*2);
				if(current*2+1<=lastIndex) queue.offer(current*2+1);				
			}
			System.out.println();
			++level;
		}		
	}
	
	// 전위순회
	public void dfs(int curr) {
		
		if( curr > lastIndex) return;
		
		// VLR
		System.out.println(nodes[curr]);
		dfs(curr * 2);
		dfs(curr * 2 + 1);
	}
	
	// 준위순회
	public void dfs2(int curr) {
		
		if ( curr > lastIndex ) return;
		
		// LVR
		dfs(curr * 2);
		System.out.println(nodes[curr]);
		dfs(curr * 2 + 1);
	}
	
	// 후위순회
	public void dfs3(int curr) {
		
		if ( curr > lastIndex ) return;
		
		// LRV
		dfs(curr * 2);
		dfs(curr * 2 + 1);
		System.out.println(nodes[curr]);
	}
	
	// =====================================================================
	
	public void printTreeByPreOrder(){
		System.out.print("PreOrder :");
		printTreeByPreOrder(1);
		System.out.println();
	}
	private void printTreeByPreOrder(int current){
		if(current <= lastIndex){
			System.out.print(nodes[current]+" "); // 현재 노드 방문처리
			printTreeByPreOrder(current*2);// 왼쪽 자식노드 방문처리
			printTreeByPreOrder(current*2+1);// 오른쪽 자식노드 방문처리
		}
	}
	
	public void printTreeByInOrder(){
		System.out.print("InOrder :");
		printTreeByInOrder(1);
		System.out.println();
	}
	
	private void printTreeByInOrder(int current){
		if(current <= lastIndex){
			printTreeByInOrder(current*2);			// 왼쪽 자식노드 방문처리
			System.out.print(nodes[current]+" ");		// 현재 노드 방문처리
			printTreeByInOrder(current*2+1);			// 오른쪽 자식노드 방문처리
		}
	}
		
	public void printTreeByPostOrder(){
		System.out.print("PostOrder :");
		printTreeByPostOrder(1);
		System.out.println();
	}
	private void printTreeByPostOrder(int current){
		if(current <= lastIndex){
			printTreeByPostOrder(current*2);			// 왼쪽 자식노드 방문처리
			printTreeByPostOrder(current*2+1);		// 오른쪽 자식노드 방문처리
			System.out.print(nodes[current]+" ");		// 현재 노드 방문처리
		}
		
	}	
	

	
}