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≤ N ≤26)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N ๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๋ ธ๋์ ๊ทธ์ ์ผ์ชฝ ์์ ๋ ธ๋, ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ์ฃผ์ด์ง๋ค. ๋ ธ๋์ ์ด๋ฆ์ A๋ถํฐ ์ฐจ๋ก๋๋ก ์๋ฌธ์ ๋๋ฌธ์๋ก ๋งค๊ฒจ์ง๋ฉฐ, ํญ์ A๊ฐ ๋ฃจํธ ๋ ธ๋๊ฐ ๋๋ค. ์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ์๋.์ผ๋ก ํํ๋๋ค.
ํธ๋ฆฌ
ํธ๋ฆฌ๋ ๋ง ๊ทธ๋๋ก ๋๋ฌด๋ฅผ ๊ฑฐ๊พธ๋ก ์ธ์๋์ ๊ฒ์ฒ๋ผ ์๊ธด ๊ทธ๋ํ๋ค.

๋ฏฟ๊ธฐ์ง ์๊ฒ ์ง๋ง, ๋๋ฌด๋ฅผ ๊ฑฐ๊พธ๋ก ์ธ์๋์ ๋ฏํ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ดค๋ค.
โ
- ํธ๋ฆฌ์ ์กฐ๊ฑด
1. ๋ชจ๋ ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค.
2. ์ฌ์ดํด(์ํ)์ ๊ฐ์ง์ง ์์์ผ ํ๋ค.
3. ๋ฃจํธ๋ผ๋ ํน๋ณํ ๋ ธ๋๊ฐ ํ ๊ฐ ์กด์ฌํด์ผ ํ๊ณ , ๋ฃจํธ ๋ ธ๋๋ก๋ถํฐ ๋ค๋ฅธ ์ด๋ ํ ๋ ธ๋๋ก ๊ฐ ๋, ๊ทธ ๊ฒฝ๋ก๊ฐ ์ ์ผํด์ผ ํ๋ค.
ํธ๋ฆฌ ์ฉ์ด
๋ฃจํธ ๋ ธ๋ : ๊ฐ์ฅ ๋์ ๊ณณ์ ์์นํ ๋ ธ๋๋ฅผ ๋ฃจํธ(root) ๋ ธ๋๋ผ๊ณ ํ๋ค.
์๋ธ ํธ๋ฆฌ : ๋ฃจํธ ๋ ธ๋๋ฅผ ์ ์ธํ ์ด๋ค ๋ ธ๋๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ํ์ฌ ๋ง๋ค์ด์ง๋ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค. ์ ๊ทธ๋ฆผ์์ ๋ฃจํธ ๋ ธ๋๊ฐ ์์ด์ก๋ค๊ณ ์๊ฐํด ๋ณด๋ฉด, 2์ 3๋ฒ์ด ๋ฃจํธ ๋ ธ๋๊ฐ ๋์ด ๋ ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค. ์ด ํธ๋ฆฌ๋ฅผ ์๋ธ ํธ๋ฆฌ๋ผ๊ณ ํ๋ค.
์ฐจ์ : ์ด๋ค ๋ ธ๋์ ์๋ธ ํธ๋ฆฌ์ ๊ฐ์๋ฅผ ๋งํ๋๋ฐ, 2๋ฒ ๋ ธ๋์ ์ฐจ์๋ 2์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, 4๋ฒ ๋ ธ๋์ ์ฐจ์๋ 2์ด๋ค.
์์ ๋ ธ๋ : ์ด๋ค ๋ ธ๋์ ์๋ธ ํธ๋ฆฌ์ ๋ฃจํธ ๋ ธ๋๋ค์ ๋งํ๋ค. 2๋ฒ ๋ ธ๋์ ์์ ๋ ธ๋๋ 4์ 5๋ฒ ๋ ธ๋์ด๋ค.
๋ถ๋ชจ ๋ ธ๋ : ์์ ๋ ธ๋์ ๋ฐ๋๋ก, 4๋ฒ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ 2๋ฒ ๋ ธ๋์ด๊ณ , 12๋ฒ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ 6๋ฒ ๋ ธ๋์ด๋ค.
ํ์ ๋ ธ๋ : ๋์ผํ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋ ๋ ธ๋๋ก, 4์ 5๋ฒ ๋ ธ๋๋ ํ์ ์ด๊ณ , 12์ 13๋ฒ ๋ ธ๋๋ ํ์ ์ด๋ค.
์ ๋ ธ๋(๋จ๋ง ๋ ธ๋) : ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ก, ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋์ด๋ค. 8, 9, 10, 11, 12, 13, 14, 15๋ฒ ๋ ธ๋๋ค์ด ์ ๋ ธ๋๋ค.
๋น๋จ๋ง ๋ ธ๋ : ์ ๋ ธ๋์ ๋ฐ๋๋ก ์์ ๋ ธ๋๊ฐ 1๊ฐ ์ด์์ธ ๋ ธ๋๋ก ์ ๊ทธ๋ฆผ์์๋ ์ ๋ ธ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๋ค์ด ๋น๋จ๋ง ๋ ธ๋์ด๋ค.
์ด์ง ํธ๋ฆฌ
์ด์ง ํธ๋ฆฌ๋ ํธ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์, ๋ฃจํธ์ ์ต๋ 2๊ฐ์ ์๋ธ ํธ๋ฆฌ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ฆ, ์ด๋ค ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ 3๊ฐ์ผ ์ ์๋ค. ํ์ง๋ง ์์ ๋ ธ๋๊ฐ 0๊ฐ, 1๊ฐ, 2๊ฐ์ธ ๊ฑด ๊ฐ๋ฅํ๋ค.
์ด์ง ํธ๋ฆฌ๋ ๋ฃจํธ์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋๋ค. ๋ฌผ๋ก ์์ ๋ ธ๋๊ฐ 0๊ฐ๋ฉด ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ ์๋ ์๋ค.
โ
์ด์ง ํธ๋ฆฌ ์ํ ๋ฐฉ๋ฒ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ์ ์ ์ํ(preorder)
- ์ค์ ์ํ(inorder)
- ํ์ ์ํ(postorder)
์ ์ ์ํ
๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ๋ค์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ, ๊ทธ๋ค์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
์์ ์๋ ๋ค์ง์ด์ง ๋๋ฌด ๊ทธ๋ฆผ์์ ์ ์ ์ํ๋ฅผ ์ด์ฉํ๋ฉด,
1, 2, 4, 8, 9, 5, 10, 11, 3, 6, 12, 13, 7, 14, 15 ๋ฒ ์์๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
์ค์ ์ํ
์ผ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ๋ค์ ๋ฃจํธ ๋ ธ๋, ๊ทธ๋ค์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
์์ ์๋ ๋ค์ง์ด์ง ๋๋ฌด ๊ทธ๋ฆผ์์ ์ค์ ์ํ๋ฅผ ์ด์ฉํ๋ฉด,
8, 4, 9, 2, 10, 5, 11, 1, 12, 6, 13, 3, 14, 7, 15 ๋ฒ ์์๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
ํ์ ์ํ
์ผ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ๊ทธ๋ค์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ, ๊ทธ๋ค์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
์์ ์๋ ๋ค์ง์ด์ง ๋๋ฌด ๊ทธ๋ฆผ์์ ํ์ ์ํ๋ฅผ ์ด์ฉํ๋ฉด,
8, 9, 4, 10, 11, 5, 2, 12, 13, 6, 14, 15, 7, 3, 1 ๋ฒ ์์๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
์ฝ๋ ์ค๋ช
1. ๊ตฌ์กฐ์ฒด
โ
typedef struct node* TreeNode;
typedef struct node {
char data;
TreeNode left, right;
}node;
โ
๊ตฌ์กฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ง๋๋ ๋ฐ์ดํฐ ํ์ ์ด๋ค. ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์๋ int, float ๋ฑ์ด ์๋ค.
์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ ํ์ ๋ค์ ํ์์ ๋ฐ๋ผ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.
๋๋ node๋ผ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ง๋ค์๋ค.
โ
2. ์ ์ ์ํ
โ
void preorder(TreeNode ptr) {
if (ptr != NULL) {
cout << ptr->data;
preorder(ptr->left);
preorder(ptr->right);
}
}
โ
NULL์ ๋น์ด์์์ ์๋ฏธํ๋๋ฐ,
๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ๋น์ด์์ง ์๋ค๋ฉด, if ๋ฌธ์ ์คํํ๋ค.
์ ์ ์ํ๋ ๋ฃจํธ ๋ ธ๋, ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ ์์๋ก ๋ฐฉ๋ฌธ์ ํ๋ค.
๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด ํ์ฌ ๋ ธ๋๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์์์ ๋ง๋ ๊ตฌ์กฐ์ฒด์์ data๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ค์ ๋ค์ ์ฌ๊ท์ ์ผ๋ก preorder ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
โ
3. ๊ตฌ์กฐ์ฒด ์ ์ธ
โ
node nodes[27];
โ
1๋ฒ์์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์์ ๋ฟ์ด์ง ํธ์ถ์ ํ์ง ์์๋ค.
์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ผญ ์ ์ธ์ ํด์ผ ํ๋ค.
์ ์ธํ ํ๋ก ๊ตฌ์กฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์กํ๊ฒ ๋๋ค.
โ
4.
โ
for (int i = 0; i < n; i++) {
cin >> a >> b >> c;
nodes[a - 'A'].data = a;
if (b == '.') nodes[a - 'A'].left = NULL;
else nodes[a - 'A'].left = &nodes[b - 'A'];
if (c == '.') nodes[a - 'A'].right = NULL;
else nodes[a - 'A'].right = &nodes[c - 'A'];
}
โ
์๋ ๋ด์ฉ์ ์ฌ์ฉ์์๊ฒ ์ ๋ ฅ๋ฐ์ ๊ฐ์ n ๋งํผ ๋ฐ๋ณตํ๋ค.
'A'๋ถํฐ 'Z'๊น์ง์ ๋ฌธ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
์ฒ์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋ณ์ a, b, c์ ์ฐจ๋ก๋ก ๋ด๋๋ค.
nodes[a-'A']์์ a-'A'๋ฅผ ํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
a๋ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋ด๊ณ ์๋ ๋ณ์์ด๋ค.
๋ง์ฝ 'A'๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด 'A'-'A'๋ฅผ ํด์ 0์ด ๋๋ค.
๊ทธ๋ฌ๋ฉด nodes์ 0๋ฒ index์ ๋ฐฉ๋ฌธํ๋ค.
๋ง์ฝ 'B'๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด 'B'-'A'๋ฅผ ํด์ 1์ด ๋์ด nodes์ 1๋ฒ index์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
node ๊ตฌ์กฐ์ฒด์์
.data๋ ํ์ฌ ๋ ธ๋๋ฅผ ์ถ๋ ฅํ๋ค.
.left๋ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
.right๋ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
๋ง์ฝ ์ฌ์ฉ์๊ฐ .์ ์ ๋ ฅํ๋ค๋ฉด ์์ ๋ ธ๋๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก, nodes์ ํด๋น index์ NULL ๊ฐ์ ๋ฃ๋๋ค.
โ
5. ๋ฐฉ๋ฌธ ์์ ์ถ๋ ฅ
โ
preorder(&nodes[0]);
โ
nodes์ 0๋ฒ index๋ถํฐ ์์ํ์ฌ ์ ์ ์ํ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค.
์ฝ๋
#include <iostream>
using namespace std;
typedef struct node* TreeNode;
typedef struct node {
char data;
TreeNode left, right;
}node;
void preorder(TreeNode ptr) {
if (ptr != NULL) {
cout << ptr->data;
preorder(ptr->left);
preorder(ptr->right);
}
}
void inorder(TreeNode ptr) {
if (ptr != NULL) {
inorder(ptr->left);
cout << ptr->data;
inorder(ptr->right);
}
}
void postorder(TreeNode ptr) {
if (ptr != NULL) {
postorder(ptr->left);
postorder(ptr->right);
cout << ptr->data;
}
}
int main() {
node nodes[27];
int n;
char a, b, c;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a >> b >> c;
nodes[a - 'A'].data = a;
if (b == '.') nodes[a - 'A'].left = NULL;
else nodes[a - 'A'].left = &nodes[b - 'A'];
if (c == '.') nodes[a - 'A'].right = NULL;
else nodes[a - 'A'].right = &nodes[c - 'A'];
}
preorder(&nodes[0]);
cout << endl;
inorder(&nodes[0]);
cout << endl;
postorder(&nodes[0]);
return 0;
}

โ
โ
'๋ฐฑ์ค ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2580๋ฒ_๋ฐฑํธ๋ํน_์ค๋์ฟ (0) | 2022.06.11 |
---|---|
[๋ฐฑ์ค] 2309๋ฒ_๋ธ๋ฃจํธ ํฌ์ค_์ผ๊ณฑ ๋์์ด (0) | 2022.06.11 |
[๋ฐฑ์ค] 10845๋ฒ_์๊ณ ๋ฆฌ์ฆ_์๋ฃ๊ตฌ์กฐ_ํ (0) | 2022.06.11 |
[๋ฐฑ์ค] 10828๋ฒ_์๊ณ ๋ฆฌ์ฆ_์๋ฃ๊ตฌ์กฐ_์คํ (0) | 2022.06.11 |
[๋ฐฑ์ค] 17219๋ฒ_์๊ณ ๋ฆฌ์ฆ_์๋ฃ๊ตฌ์กฐ_๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ (0) | 2022.06.11 |