νΈλ¦¬ μν
νΈλ¦¬ μν(Tree Traversal)λ?
- νΈλ¦¬ ꡬ쑰μμ λͺ¨λ λ Έλλ₯Ό νΉμ ν μμλ‘ ν λ²μ© λ°©λ¬Ένλ λ°©λ²μ λλ€.
- νΈλ¦¬λ κ³μΈ΅μ μλ£κ΅¬μ‘°μ΄λ―λ‘ λ¨μν μ νμ μΌλ‘ νμνλ κ² μλλΌ λ Έλ κ°μ λΆλͺ¨-μμ κ΄κ³λ₯Ό κ³ λ €ν νμ λ°©μμ΄ νμν©λλ€.
- μνλ μ»΄ν¨ν° ꡬ쑰, νμΌ μμ€ν νμ, μμ νΈλ¦¬ νκ° λ± λ€μν λΆμΌμμ νμ©λ©λλ€.
- μν λ°©λ²μΌλ‘λ μ μ μν, μ€μ μν, νμ μνκ° μμ΅λλ€.
β μ μ¬λ¬κ°μ§ μν λ°©λ²μ΄ μ‘΄μ¬νλμ?
- νΈλ¦¬λ λ°©ν₯μ±κ³Ό κ³μΈ΅μ΄ μλ ꡬ쑰μ΄κΈ° λλ¬Έμ μ΄λ€ λ Έλλ₯Ό λ¨Όμ λ°©λ¬Έν μ§, μμ λ Έλλ₯Ό μΈμ μ²λ¦¬ν μ§μ λ°λΌ μλ―Έκ° λ¬λΌμ§κΈ° λλ¬Έμ λλ€.
μ μ μν(Preorder Traversal)
- μμ (λΆλͺ¨) λ Έλλ₯Ό λ¨Όμ λ°©λ¬Ένκ³ μΌμͺ½ → μ€λ₯Έμͺ½ μμ μμΌλ‘ νμνλ λ°©λ²μ λλ€.
- νΈλ¦¬ 볡μ¬, ννμ μμ± λ±μ μμ£Ό μ¬μ©λ©λλ€.
- μλ μ½λ
Preorder(node):
if node is not null:
visit(node) // νμ¬ λ
Έλλ₯Ό λ¨Όμ λ°©λ¬Έ
Preorder(node.left) // μΌμͺ½ μλΈνΈλ¦¬ μν
Preorder(node.right) // μ€λ₯Έμͺ½ μλΈνΈλ¦¬ μν
μ€μ μν(Inorder Traversal)
- μΌμͺ½ μμ λ Έλλ€μ λ¨Όμ νμνκ³ κ·Έλ€μ 루νΈλ₯Ό λ°©λ¬Έ, λ§μ§λ§μΌλ‘ μ€λ₯Έμͺ½ μμ λ Έλλ€μ νμν©λλ€.
- μ΄μ§ νμ νΈλ¦¬(BST)μμ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λ κ²°κ³Όλ₯Ό μ»μ μ μλ μνμ λλ€.
- μλ μ½λ
Inorder(node):
if node is not null:
Inorder(node.left) // μΌμͺ½ μλΈνΈλ¦¬ μν
visit(node) // νμ¬ λ
Έλ λ°©λ¬Έ
Inorder(node.right) // μ€λ₯Έμͺ½ μλΈνΈλ¦¬ μν
νμ μν(Postorder Traversal)
- μΌμͺ½ → μ€λ₯Έμͺ½ μμ λ Έλλ₯Ό λͺ¨λ λ°©λ¬Ένκ³ μμ (λΆλͺ¨) λ Έλλ₯Ό νμνλ λ°©λ²μ λλ€.
- νΈλ¦¬ ꡬ쑰 μμ λ νμ μμ μλ£ ν μμ μμ μ ν΄μΌ νλ κ²½μ°μ μ ν©ν©λλ€.
- μλ μ½λ
Postorder(node):
if node is not null:
Postorder(node.left) // μΌμͺ½ μλΈνΈλ¦¬ μν
Postorder(node.right) // μ€λ₯Έμͺ½ μλΈνΈλ¦¬ μν
visit(node) // νμ¬ λ
Έλλ₯Ό λ§μ§λ§μ λ°©λ¬Έ
νΈλ¦¬ μν μμ
A
/ \
B C
/ \
D E
| μν λ°©μ | λ°©λ¬Έ μμ |
|---|---|
| μ μ μν | A → B → D → E → C |
| μ€μ μν | D → B → E → A → C |
| νμ μν | D → E → B → C → A |
νΈλ¦¬ μν μ½λ ꡬννκΈ°
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100;
struct TreeNode {
char data;
int left; // μΌμͺ½ μμμ μΈλ±μ€
int right; // μ€λ₯Έμͺ½ μμμ μΈλ±μ€
};
// νΈλ¦¬ λ°°μ΄ μ μ
TreeNode tree[MAX];
int root = 0; // λ£¨νΈ λ
Έλ μΈλ±μ€
// μ μ μν (Preorder): λ£¨νΈ → μΌμͺ½ → μ€λ₯Έμͺ½
void preorder(int idx) {
if (idx == -1) return;
cout << tree[idx].data << ' ';
preorder(tree[idx].left);
preorder(tree[idx].right);
}
// μ€μ μν (Inorder): μΌμͺ½ → λ£¨νΈ → μ€λ₯Έμͺ½
void inorder(int idx) {
if (idx == -1) return;
inorder(tree[idx].left);
cout << tree[idx].data << ' ';
inorder(tree[idx].right);
}
// νμ μν (Postorder): μΌμͺ½ → μ€λ₯Έμͺ½ → 루νΈ
void postorder(int idx) {
if (idx == -1) return;
postorder(tree[idx].left);
postorder(tree[idx].right);
cout << tree[idx].data << ' ';
}
int main() {
/*
A
/ \
B C
/ \
D E
*/
// λ
Έλ ꡬμ±
tree[0] = {'A', 1, 2}; // A: left → B(1), right → C(2)
tree[1] = {'B', 3, 4}; // B: left → D(3), right → E(4)
tree[2] = {'C', -1, -1}; // C: 리ν
tree[3] = {'D', -1, -1}; // D: 리ν
tree[4] = {'E', -1, -1}; // E: 리ν
cout << "μ μ μν (Preorder): ";
preorder(root);
cout << "\n";
cout << "μ€μ μν (Inorder): ";
inorder(root);
cout << "\n";
cout << "νμ μν (Postorder): ";
postorder(root);
cout << "\n";
return 0;
}
λ§λ¬΄λ¦¬νλ©°
- μ΄λ² κΈμμλ νΈλ¦¬ μλ£κ΅¬μ‘°μμ κ°μ₯ ν΅μ¬μ μΈ κ°λ μ€ νλμΈ νΈλ¦¬ μν(Tree Traversal) λ°©λ²μ λν΄ μμ보μμ΅λλ€.
- μ μ μνλ 루νΈμμ μμν΄ μ’μ° μμμ λ°©λ¬Ένλ―λ‘ νΈλ¦¬μ ꡬ쑰λ₯Ό μ μ₯νκ±°λ 볡μν λ μ μ©ν©λλ€.
- μ€μ μνλ μ΄μ§ νμ νΈλ¦¬μμ μ€λ¦μ°¨μ μ λ ¬λ κ²°κ³Όλ₯Ό μ»λ λ° μμ£Ό μ¬μ©λ©λλ€.
- νμ μνλ μμ λ Έλλ₯Ό λͺ¨λ μ²λ¦¬ν ν λΆλͺ¨λ₯Ό λ°©λ¬ΈνκΈ° λλ¬Έμ λλ ν 리 μμ μ κ°μ μμ μμμμ μ ν©ν©λλ€.
- νΈλ¦¬ μνλ λ¨μν μ΄λ‘ μΌλ‘ λλλ κ°λ μ΄ μλλΌ μ€μ μκ³ λ¦¬μ¦ λ¬Έμ μ μλ£κ΅¬μ‘° ꡬνμ μ§μ μ μΌλ‘ μ°κ²°λλ μ£Όμ μ λλ€. μκ³ λ¦¬μ¦μ κΈ°μ΄λ₯Ό λ€μ§λ λ° κΌ νμν κ°λ μ΄λ―λ‘ μ§μ μμΌλ‘ μν μμλ₯Ό κ·Έλ €λ³΄κ³ λ€μν νΈλ¦¬ ꡬ쑰μ μ μ©ν΄λ³΄λ©΄μ μ΅μν΄μ§λ κ²μ μΆμ²λ립λλ€.
