π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_자료ꡬ쑰[DS]

[Baekjoon/λ°±μ€€][1991][C/C++] 트리 순회

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 5. 3.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

트리, μž¬κ·€ 문제. 트리λ₯Ό μˆœνšŒν•˜λŠ” κ°€μž₯ 기본적인 방법인 'μ „μœ„ 순회', 'μ€‘μœ„ 순회', 'ν›„μœ„ 순회'에 λŒ€ν•΄ μ•Œκ³ μžˆλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ΄λ‹€.

1. 문제

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

 

1991번: 트리 순회

첫째 μ€„μ—λŠ” 이진 트리의 λ…Έλ“œμ˜ 개수 N(1 ≤ N ≤ 26)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 걸쳐 각 λ…Έλ“œμ™€ 그의 μ™Όμͺ½ μžμ‹ λ…Έλ“œ, 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œκ°€ 주어진닀. λ…Έλ“œμ˜ 이름은 AλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ μ•ŒνŒŒ

www.acmicpc.net

[문제]

이진 트리λ₯Ό μž…λ ₯λ°›μ•„ μ „μœ„ 순회(preorder traversal), μ€‘μœ„ 순회(inorder traversal), ν›„μœ„ 순회(postorder traversal)ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄ μœ„μ™€ 같은 이진 νŠΈλ¦¬κ°€ μž…λ ₯되면,

  • μ „μœ„ μˆœνšŒν•œ κ²°κ³Ό : ABDCEFG // (루트) (μ™Όμͺ½ μžμ‹) (였λ₯Έμͺ½ μžμ‹)
  • μ€‘μœ„ μˆœνšŒν•œ κ²°κ³Ό : DBAECFG // (μ™Όμͺ½ μžμ‹) (루트) (였λ₯Έμͺ½ μžμ‹)
  • ν›„μœ„ μˆœνšŒν•œ κ²°κ³Ό : DBEGFCA // (μ™Όμͺ½ μžμ‹) (였λ₯Έμͺ½ μžμ‹) (루트)

κ°€ λœλ‹€.

[μž…λ ₯]

첫째 μ€„μ—λŠ” 이진 트리의 λ…Έλ“œμ˜ 개수 N(1 ≤ N ≤ 26)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 걸쳐 각 λ…Έλ“œμ™€ 그의 μ™Όμͺ½ μžμ‹ λ…Έλ“œ, 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œκ°€ 주어진닀. λ…Έλ“œμ˜ 이름은 AλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œ 맀겨지며, 항상 Aκ°€ 루트 λ…Έλ“œκ°€ λœλ‹€. μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” κ²½μš°μ—λŠ” .으둜 ν‘œν˜„ν•œλ‹€.

[좜λ ₯]

첫째 쀄에 μ „μœ„ 순회, λ‘˜μ§Έ 쀄에 μ€‘μœ„ 순회, μ…‹μ§Έ 쀄에 ν›„μœ„ μˆœνšŒν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. 각 쀄에 N개의 μ•ŒνŒŒλ²³μ„ 곡백 없이 좜λ ₯ν•˜λ©΄ λœλ‹€.

[예제 μž…λ ₯ 1]

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

[예제 좜λ ₯ 1]

ABDCEFG
DBAECFG
DBEGFCA
λ°˜μ‘ν˜•

2. 풀이

μ „μœ„ 순회, μ€‘μœ„ 순회, ν›„μœ„ μˆœνšŒλž€ λ¬΄μ—‡μΌκΉŒ? 

* 트리 μˆœνšŒλž€ νŠΉμ • λͺ©μ μ„ μœ„ν•΄ 트리의 λͺ¨λ“  λ…Έλ“œλ₯Ό ν•œ λ²ˆμ”© λ°©λ¬Έν•˜λŠ” 것을 λ§ν•œλ‹€.

* 트리 κ΅¬μ‘°λŠ” 계측적 κ΅¬μ‘°λΌλŠ” νŠΉλ³„ν•œ νŠΉμ§•μ„ 가지기 λ•Œλ¬Έμ—, λͺ¨λ“  λ…Έλ“œλ₯Ό μˆœνšŒν•˜λŠ” 방법엔 크게 세가지가 μžˆλ‹€.

* μœ„μ˜ 세가지 방법이 λ°”λ‘œ μ „μœ„ 순회, μ€‘μœ„ 순회, ν›„μœ„ 순회 이닀. (순회 μˆœμ„œλŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™λ‹€.)

[Baekjoon/λ°±μ€€][1991][C/C++] 트리 순회

핡심 μ½”λ“œλ§Œ μ‚΄νŽ΄λ³΄μž.

tree λ°°μ—΄μ˜ 0번째 index μ—λŠ” A λ…Έλ“œμ˜ 정보가 μ €μž₯되고, 1번째 idxμ—λŠ” B λ…Έλ“œ, 2번째 idxμ—λŠ” C λ…Έλ“œ, ..., 25번째 idxμ—λŠ” Z λ…Έλ“œκ°€ μ €μž₯λœλ‹€.

μ—¬κΈ°μ„œ, tree[root - 'A'] λΌλŠ” λ°©μ‹μœΌλ‘œ root 값에 ν•΄λ‹Ήν•˜λŠ” λ…Έλ“œλ₯Ό 배열에 순차적으둜 μ €μž₯ν•  수 있게 λœλ‹€.

3. μ½”λ“œ

#include <iostream>
using namespace std;

/* Struct */
struct node {
	char left;
	char right;
};

/* Global */
node tree[26]; // A(0)~Z(26) κΉŒμ§€ μ €μž₯.

/* Function */
void preorder(char root) { //μ „μœ„μˆœνšŒ
	if (root != '.') {
		cout << root;
		preorder(tree[root - 'A'].left);
		preorder(tree[root - 'A'].right);
	}
}

void inorder(char root) { //μ€‘μœ„μˆœνšŒ
	if (root != '.') {
		inorder(tree[root - 'A'].left);
		cout << root;
		inorder(tree[root - 'A'].right);
	}
}

void postorder(char root) { //ν›„μœ„μˆœνšŒ
	if (root != '.') {
		postorder(tree[root - 'A'].left);
		postorder(tree[root - 'A'].right);
		cout << root;
	}
}

/* Main */
int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Input & Init */
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		/* Input */
		char root, left, right;
		cin >> root >> left >> right;
		/* Tree */
		tree[root - 'A'].left = left;
		tree[root - 'A'].right = right;
	}

	/* Output */
	preorder('A');
	cout << '\n';
	inorder('A');
	cout << '\n';
	postorder('A');
	cout << '\n';
		
	/* Return */
	return 0;
}
728x90
λ°˜μ‘ν˜•