관리 메뉴

너와 나의 스토리

(BOJ) 9934 완전 이진 트리 본문

Algorithm/기타

(BOJ) 9934 완전 이진 트리

노는게제일좋아! 2019. 7. 31. 21:22
반응형

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

 

 

문제 풀이:

위에서부터 왼쪽에서 오른쪽으로 1번부터 순서를 매긴다고 하자.

깊이가 k일 때, 마지막 레벨의 번호는 $2^{k-1}$≤N≤$2^{k}-1$이다.

l: $2^{k-1}$

r: $2^{k}-1$ 

pos: 1 (도착 순서)

이라고 하자.

 

1. 왼쪽 노드를 방문 안했고 현재 l보다 작다면(아직 마지막 층이 아니라면) -> 왼쪽 노드로 이동

2. 왼쪽 노드를 방문 했고 현재 자신의 위치에서 방문한 적이 없으면

    -> 입력 받은 순서대로 트리의 해당 위치에 값을 넣어준다.

3. 현재 위치를 방문했고, 오른쪽 노드는 방문 하지 않았는데 현재 l보다 작다면 -> 오른쪽 노드로 이동

 

 

소스 코드:

int h,l,r,arr[1026],res[1026],pos=1;
bool visit[1026];
void func(int cur) {
	if (!visit[cur*2]&&cur< l) func(cur * 2);
	if (!visit[cur] && cur >= l && cur <= r) {
		visit[cur] = true;
		res[cur] = arr[pos++];
	}
	if (!visit[cur]&&visit[cur*2]) {
		visit[cur] = true;
		res[cur] = arr[pos++];
	}
	if (!visit[cur * 2 + 1] &&cur<l) func(cur * 2 + 1);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> h;
	for (int i = 1; i < pow(2, h); i++) {
		cin >> arr[i];
	}
	l = pow(2, h - 1); 
	r = pow(2, h) - 1;
	func(1);
	pos = 1;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < pow(2, i); j++) {
			cout << res[pos++]<<" ";
		}
		cout << '\n';
	}
	return 0;
}

 

 

소스 코드:

반응형

'Algorithm > 기타' 카테고리의 다른 글

[BOJ] 16287 Parcel  (0) 2019.09.27
[SW] 7829 보물왕 태혁 (D4)  (0) 2019.09.09
(BOJ) 1965 상자 넣기  (0) 2019.07.18
(BOJ) 15976 XCorr (테스트 케이스)  (0) 2019.07.14
(BOJ) 15975 화살표 그리기  (0) 2019.07.14
Comments