공부/Algorithms w.Java

[Java] 백준 9934 - 완전 이진 트리

thegreatjy 2022. 11. 10. 02:17
728x90

https://www.acmicpc.net/problem/9934

 

9934번: 완전 이진 트리

상근이는 슬로베니아의 도시 Donji Andrijevci를 여행하고 있다. 이 도시의 도로는 깊이가 K인 완전 이진 트리를 이루고 있다. 깊이가 K인 완전 이진 트리는 총 2K-1개의 노드로 이루어져 있다. (아래

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {
	static int k;
	static StringBuilder[] sb;
	static int[] numbers;
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		k = Integer.parseInt(st.nextToken()); 
		sb = new StringBuilder[k];
		for(int i=0;i<k;i++) {
			sb[i] = new StringBuilder();
		}
		st = new StringTokenizer(br.readLine());
		int n = (int)(Math.pow(2.0, k) - 1);
		numbers = new int[n];
		for(int i=0;i<n;i++) {
			numbers[i] = Integer.parseInt(st.nextToken());
		}
		
		func(0, n - 1, 0);
		
		for (int i = 0; i < k; i++)
			bw.write(sb[i].toString() + "\n");
		bw.flush();
	}
	
	//numbers[start] - numbers[finish] 에서 중간값(root node)을 찾아서 리턴 
	static void func(int start, int finish, int level) {
		if(start == finish) {
			sb[level].append(numbers[start]+" ");
			return;
		}
		
		int mid = (start + finish) / 2;
		sb[level].append(numbers[mid]+" ");
		
		func(start, mid - 1, level + 1);
		func(mid + 1, finish, level + 1);
	}

}

재귀함수로 중간 나누어서 

중간은 따로 저장해두고

처음~중간 전

중간 다음~끝

으로 재귀 보내주는 건 .. 알았는데 트리 레벨 마다 줄 띄어주고 순서가 잘못 나와서 조금 고생했다.

 

트리 레벨 별로 stringbuilder 배열을 만들어 두고 나중에 한 줄 띄어가며 프린트하면 된다. ! 

배워가도록~

 

#이진트리 #트리전위순회 #preorder

728x90