ํธ๋ฆฌ๋ ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๋ํ์ ์ธ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
์ด ๊ธ์์๋ ํธ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋
๋ถํฐ BFS/DFS ์ํ ๋ฐฉ๋ฒ๊น์ง ์ฝ๋์ ํจ๊ป ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ํธ๋ฆฌ๋ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)์ผ๋ก ๊ตฌ์ฑ๋ ๊ณ์ธต์ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
๐ณ ํธ๋ฆฌ๋ ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(DAG)์ ์ผ์ข ์ ๋๋ค.
๊ฐ์ ์ = ๋ ธ๋ ์ - 1, ์ํ ๊ตฌ์กฐ๊ฐ ์๋ค๋ ํน์ง์ด ์์ต๋๋ค.
| ์ฉ์ด | ์ค๋ช | ์์ |
|---|---|---|
| ๋ ธ๋(Node) | ํธ๋ฆฌ์ ๊ฐ ์์ (๋ฐ์ดํฐ + ํฌ์ธํฐ) | A, B, C ... |
| ๊ฐ์ (Edge) | ๋ ธ๋ ๊ฐ ์ฐ๊ฒฐ ์ | A-B, B-C |
| ๋ฃจํธ(Root) | ์ต์์ ๋ ธ๋ | ํธ๋ฆฌ์ ์์์ |
| ๋ฆฌํ(Leaf) | ์์์ด ์๋ ์ตํ์ ๋ ธ๋ | ํธ๋ฆฌ์ ๋ ๋ ธ๋ |
| ์ฐจ์(Degree) | ํ ๋ ธ๋๊ฐ ๊ฐ์ง ์์ ์ | 2์ง ํธ๋ฆฌ: ์ต๋ ์ฐจ์ 2 |
| ๋ ๋ฒจ(Level) | ๋ฃจํธ(0)๋ถํฐ์ ๊น์ด | ๋ ๋ฒจ 0 โ ๋ฃจํธ |
| ๋์ด(Height) | ๋ฃจํธ์์ ๊ฐ์ฅ ๋จผ ๋ฆฌํ๊น์ง์ ๊ฑฐ๋ฆฌ | ํธ๋ฆฌ์ ์ต๋ ๊น์ด |
ํธ๋ฆฌ ์ํ๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ๊ธฐ์ ์
๋๋ค.
์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก BFS(Level-order)์ DFS(Pre/In/Post-order)๊ฐ ์์ต๋๋ค.
๋ ๋ฒจ๋ณ๋ก ์ขโ์ฐ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์
๋๋ค.
ํ(Queue)๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ฉฐ, ์ต๋จ ๊ฒฝ๋ก ํ์์ ์ ์ฉํฉ๋๋ค.
 {
if (root == null) return;
Queue q = new ArrayDeque<>();
q.add(root);
while (!q.isEmpty()) {
Node cur = q.poll();
System.out.print(cur.value + " ");
for (Node child : cur.children) {
q.add(child);
}
}
}
**์คํ ๊ฒฐ๊ณผ**: A โ B โ C โ D โ E โ F โ G โ H โ I โ J โ K โ L
**์๊ฐ ๋ณต์ก๋**: O(N) (๋ชจ๋ ๋
ธ๋ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธ)
---
### 2. DFS (Depth First Search)
ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ ํ ๋์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํฉ๋๋ค.
**์ฌ๊ท** ๋๋ **์คํ**์ผ๋ก ๊ตฌํํ๋ฉฐ, **์ ์/์ค์/ํ์** ์ธ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค.
#### (1) ์ ์ ์ํ (Pre-order)
**๋
ธ๋ โ ์ผ์ชฝ โ ์ค๋ฅธ์ชฝ** ์์๋ก ๋ฐฉ๋ฌธํฉ๋๋ค.
ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณต์ ํ ๋ ์ ์ฉํฉ๋๋ค.
```java
void preOrder(Node root) {
if (root == null) return;
System.out.print(root.value + " "); // ํ์ฌ ๋
ธ๋
preOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
preOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
}
์คํ ๊ฒฐ๊ณผ: A โ B โ E โ F โ C โ G โ H โ D โ I โ J โ K โ L
์ผ์ชฝ โ ๋
ธ๋ โ ์ค๋ฅธ์ชฝ ์์๋ก ๋ฐฉ๋ฌธํฉ๋๋ค.
์ด์ง ํ์ ํธ๋ฆฌ(BST)์์ ๊ฐ ์ ๋ ฌ ์ ์ฌ์ฉ๋ฉ๋๋ค.
void inOrder(Node root) {
if (root == null) return;
inOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
System.out.print(root.value + " "); // ํ์ฌ ๋
ธ๋
inOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
}
์คํ ๊ฒฐ๊ณผ: E โ B โ F โ A โ G โ C โ H โ D โ J โ I โ K โ L
์ผ์ชฝ โ ์ค๋ฅธ์ชฝ โ ๋
ธ๋ ์์๋ก ๋ฐฉ๋ฌธํฉ๋๋ค.
ํธ๋ฆฌ ์ญ์ ์์
์ ์ ์ฉํฉ๋๋ค.
void postOrder(Node root) {
if (root == null) return;
postOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
postOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
System.out.print(root.value + " "); // ํ์ฌ ๋
ธ๋
}
์คํ ๊ฒฐ๊ณผ: E โ F โ B โ G โ H โ C โ J โ K โ L โ I โ D โ A
์๊ฐ ๋ณต์ก๋: ์ธ ๋ฐฉ์ ๋ชจ๋ O(N) (๊ฐ ๋ ธ๋ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธ)
ํธ๋ฆฌ ์ํ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ์ ๊ธฐ์ด์ ๋๋ค.
๋ฌธ์ ์ ํ์ ๋ง์ถฐ ์ ์ ํ ์ํ ๋ฐฉ์์ ์ ํํด๋ณด์ธ์!
๊ถ๊ธํ ์ ์ด๋ ๋ณด์ํ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ ๐
velog์ ๋ณต์ฌํ์ฌ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ถ๊ฐ ์ค๋ช
์ด๋ ์์๊ฐ ํ์ํ๋ฉด ์ธ์ ๋ ์์ฒญํด ์ฃผ์ธ์!
ํธ๋ฆฌ๋ ๋ ธ๋์ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๊ณ์ธต์ ์๋ฃ๊ตฌ์กฐ๋ก, ๋ค์ํ ๊ตฌํ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค. ์๋๋ ์ค์ ์ฝ๋ฉํ ์คํธ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์์ฃผ ๋ฑ์ฅํ๋ ํธ๋ฆฌ ๊ตฌํ ํจํด๋ค์ ํ๋์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
ํธ๋ฆฌ๋ฅผ ๊ตฌํํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ์ผ์ข
์ด๋ฏ๋ก, ๊ทธ๋ํ์์ ๋๋ฆฌ ์ฐ์ด๋ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ๋ฆฌ๋ ๋ถ๋ชจ-์์ ๊ด๊ณ๊ฐ ๋ช
ํํ๊ณ ๋ฐฉํฅ์ฑ์ด ์์ผ๋ฏ๋ก ๋จ๋ฐฉํฅ ๊ทธ๋ํ๋ก ๊ตฌํํฉ๋๋ค.
| ๋ฐฉ์ | ์๋ฃํ | ํน์ง |
|---|---|---|
| 2์ฐจ์ ๋ฐฐ์ด | int[][] | ์ ๋ ฅ์ด ๋ฐฐ์ด ํํ๋ก ์ฃผ์ด์ง ๋ ์ฌ์ฉ, ์ ์ ๊ตฌ์กฐ |
| 2์ฐจ์ ๋ฆฌ์คํธ | List> | ๋ ธ๋ ๋ฒํธ๊ฐ ์ฐ์์ ์ผ ๋, edge ๋ฆฌ์คํธ๋ฅผ ๋ฐํ์ผ๋ก ์ง์ ๊ตฌ์ฑ |
| ํด์๋งต | Map> | ๋ ธ๋ ๋ฒํธ๊ฐ ๋ถ์ฐ์์ ์ด๊ฑฐ๋ ๋ฌธ์์ด์ผ ๋ ์ ํฉ |
int[][] tree = {
{1, 2}, // 0๋ฒ ๋
ธ๋์ ์์
{}, // 1๋ฒ ๋
ธ๋์ ์์
{3, 4}, // 2๋ฒ ๋
ธ๋์ ์์
{}, // 3๋ฒ ๋
ธ๋์ ์์
{} // 4๋ฒ ๋
ธ๋์ ์์
};
์์ ๋ ธ๋ ์ํ:
for (int child : tree[0]) {
System.out.println(child); // 1, 2
}
int n = 5;
List> tree = new ArrayList<>();
for (int i = 0; i ());
tree.get(0).add(1);
tree.get(0).add(2);
tree.get(2).add(3);
tree.get(2).add(4);
์์ ๋ ธ๋ ์ํ:
for (int child : tree.get(0)) {
System.out.println(child); // 1, 2
}
Map> tree = new HashMap<>();
tree.putIfAbsent(0, new ArrayList<>());
tree.get(0).add(1);
tree.get(0).add(2);
tree.putIfAbsent(2, new ArrayList<>());
tree.get(2).add(3);
tree.get(2).add(4);
์์ ๋ ธ๋ ์ํ:
for (int child : tree.get(0)) {
System.out.println(child); // 1, 2
}
ํธ๋ฆฌ์ ๊ฐ ๊ฐ์ ์ ๋ถ๋ชจ-์์ ์์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ์์
๋๋ค.
๋ฌธ์ ์ ์
๋ ฅ์ด ๊ฐ์ ๋ฆฌ์คํธ ํํ์ผ ๋๊ฐ ๋ง์ผ๋ฉฐ, ๋ณดํต ๊ฐ์ ๋ฆฌ์คํธ โ ์ธ์ ๋ฆฌ์คํธ๋ก ๋ณํํด์ ์ฌ์ฉํฉ๋๋ค.
int[][] edges = {
{0, 1},
{0, 2},
{2, 3},
{2, 4}
};
List> tree = new ArrayList<>();
for (int i = 0; i ());
for (int[] edge : edges) {
int parent = edge[0], child = edge[1];
tree.get(parent).add(child);
}
Map> tree = new HashMap<>();
for (int[] edge : edges) {
int parent = edge[0], child = edge[1];
tree.putIfAbsent(parent, new ArrayList<>());
tree.get(parent).add(child);
}
์ฃผ์: ํด์๋งต ๊ธฐ๋ฐ ์ธ์ ๋ฆฌ์คํธ๋ ์์์ด ์๋ ๋ ธ๋๊ฐ Map์ ํฌํจ๋์ง ์์ ์ ์์ต๋๋ค.
ํ์ ์containsKey()๋๋getOrDefault()๋ฅผ ํ์ฉํด ์์ ํ๊ฒ ์ํํ์ธ์.
for (int child : tree.getOrDefault(1, Collections.emptyList())) {
// ์์ ํ๊ฒ ์ํ
}
๊ฐ ๋
ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์๋ง ๊ฐ์ง๋ ๊ตฌ์กฐ์
๋๋ค.
ํด๋์ค ๊ธฐ๋ฐ ํธ๋ฆฌ ๊ตฌํ์ Leetcode ๋ฑ์์ ๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
์์ ๋ ธ๋ ์ ๊ทผ:
System.out.println(root.left);
System.out.println(root.right);
์์์ ์๊ฐ ์ ํด์ ธ ์์ง ์์ ํธ๋ฆฌ ๊ตฌ์กฐ์
๋๋ค.
๊ฐ ๋
ธ๋๊ฐ ์์ ๋
ธ๋ ๋ฆฌ์คํธ๋ฅผ ์ง์ ๊ด๋ฆฌํฉ๋๋ค.
class Node {
int val;
List children;
Node() {}
Node(int val) { this.val = val; }
Node(int val, List children) {
this.val = val;
this.children = children;
}
}
์์ ๋ ธ๋ ์ํ:
for (Node child : root.children) {
System.out.println(child.val);
}
์์ ์ด์ง ํธ๋ฆฌ์์๋ ๋ ธ๋๋ฅผ ๋ ๋ฒจ ์์๋๋ก ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ํจ์จ์ ์ ๋๋ค.
int[] tree = {0, 1, 2, -1, -1, 3, 4}; // -1์ ๋น ์๋ฆฌ
๊ฐ ๋ ธ๋์ ์์ ์ ๋ณด๋ฅผ ๋ฐฐ์ด๋ก ์ฃผ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
int[][] links = {
{-1, -1}, // 0๋ฒ ๋
ธ๋์ ์์ ์์
{-1, -1}, // 1๋ฒ ๋
ธ๋์ ์์ ์์
{-1, 0}, // 2๋ฒ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์์์ด 0๋ฒ
{2, 1} // 3๋ฒ ๋
ธ๋์ ์ผ์ชฝ ์์์ด 2๋ฒ, ์ค๋ฅธ์ชฝ ์์์ด 1๋ฒ
};
ํธ๋ฆฌ๋ ๋ฌธ์ ์ ์ ๋ ฅ ํํ์ ๋ฐ๋ผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฌธ์ ์ ๋ฐ๋ผ ์ ํฉํ ๊ตฌํ ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
ํธ๋ฆฌ๋ ๊ณ์ธต์ ๊ตฌ์กฐ์ ์ฌ๊ท์ ์ ์๊ฐ ํต์ฌ์ธ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ํธ๋ฆฌ์ ๋ณธ์ง, ์ฌ๊ท์ ํ์ ์๋ฆฌ, ๋ค์ํ ๊ตฌํ ๋ฐ ํ์ ํจํด์ ์์ ์ฝ๋์ ํจ๊ป ์ ๋ฆฌํฉ๋๋ค.
ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๊ท์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค.
์ฆ, ํธ๋ฆฌ๋ โ์ด๋ค ๋ ธ๋ + ๊ทธ ๋ ธ๋์ ์๋ธํธ๋ฆฌ๋ค(subtrees)โ๋ก ์์ฑ๋๋ ๊ณ์ธต ๊ตฌ์กฐ์ ๋๋ค.
ํธ๋ฆฌ์์ ์์์ ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก ์ก๊ณ , ๊ทธ ํ์ ๋
ธ๋๋ค์ ๋ชจ๋ ํฌํจํ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ์๋ธํธ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.
ํธ๋ฆฌ๋ "ํธ๋ฆฌ ์์ ๋ ํธ๋ฆฌ"๊ฐ ๋ค์ด์๋ ์ฌ๊ท ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, ํธ๋ฆฌ ๋ฌธ์ ๋ฅผ ํ ๋ ์๋ธํธ๋ฆฌ ๊ฐ๋
์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์:
A
/ \
B C
/ \
D E
ํธ๋ฆฌ๋ ๋ถ๋ชจ๊ฐ ํ๋ ์ผ์ ์์๋ ๋ฐ๋ณตํ๋ค๋ ํน์ฑ ๋๋ฌธ์, ์ฌ๊ท์ ์ ๊ทผ์ด ๋งค์ฐ ์์ฐ์ค๋ฝ์ต๋๋ค.
ํธ๋ฆฌ์ ๋ชจ๋ ๋
ธ๋ ๊ฐ์ ์ถ๋ ฅํ๋ ค๋ฉด?
โ ๋ถ๋ชจ ๋
ธ๋ ๊ฐ์ ์ถ๋ ฅํ๊ณ , ์์ ๋
ธ๋๋ค์ ์ฌ๊ท ํธ์ถ๋ก ํ์
ํธ๋ฆฌ์์ ํน์ ๊ฐ์ ๊ณ์ฐํ๋ ค๋ฉด?
โ ์์ ๋
ธ๋๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์ต์ข
๊ฒฐ๋ก ๋์ถ
void dfs(Node node) {
// ํ์ฌ ๋
ธ๋ ์ฒ๋ฆฌ
System.out.println(node.value);
for (Node child : node.children) {
dfs(child);
}
}
class Node {
int value;
List children = new ArrayList<>();
Node(int value) { this.value = value; }
}
public class TreeDFS {
public static void dfs(Node node) {
System.out.println(node.value);
for (Node child : node.children) {
dfs(child);
}
}
public static void main(String[] args) {
Node root = new Node(1);
Node child1 = new Node(2);
Node child2 = new Node(3);
Node child3 = new Node(4);
Node child4 = new Node(5);
root.children.add(child1);
root.children.add(child2);
child1.children.add(child3);
child1.children.add(child4);
dfs(root);
}
}
void dfs(Node node) {
if (node == null) return;
System.out.println(node.value);
dfs(node.left);
dfs(node.right);
}
class Node {
int value;
Node left, right;
Node(int value) { this.value = value; }
}
public class BinaryTreeDFS {
public static void dfs(Node node) {
if (node == null) return;
System.out.println(node.value);
dfs(node.left);
dfs(node.right);
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
dfs(root);
}
}
Map> tree = new HashMap<>() {{
put(1, List.of(2, 3));
put(2, List.of(1, 4, 5));
put(3, List.of(1));
put(4, List.of(2));
put(5, List.of(2));
}};
void dfs(int cur, Set visited) {
System.out.println(cur);
visited.add(cur);
for (int nxt : tree.get(cur)) {
if (!visited.contains(nxt)) {
dfs(nxt, visited);
}
}
}
void dfs(int cur, int parent) {
System.out.println(cur);
for (int nxt : tree.get(cur)) {
if (nxt == parent) continue;
dfs(nxt, cur);
}
}
Map> tree = new HashMap<>() {{
put(1, List.of(2, 3));
put(2, List.of(4, 5));
put(3, List.of());
put(4, List.of());
put(5, List.of());
}};
void dfs(int cur) {
System.out.println(cur);
for (int nxt : tree.get(cur)) {
dfs(nxt);
}
}
int[] arr = {1, 2, 3, 4, 5, -1, -1};
void dfs(int index) {
if (index >= arr.length || arr[index] == -1) return;
System.out.println(arr[index]);
dfs(2 * index + 1); // ์ผ์ชฝ
dfs(2 * index + 2); // ์ค๋ฅธ์ชฝ
}
ํธ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ง๋ ๋๋ "๋ถ๋ชจ๊ฐ ํ๋ ์ผ์ ์์๋ ๋ฐ๋ณต"ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด, ์์ฐ์ค๋ฝ๊ฒ ์ฌ๊ท๋ก ์ค๊ณํ ์ ์์ต๋๋ค.
ํธ๋ฆฌ ์ํ๋ ํธ๋ฆฌ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ๊ธฐ์ ์
๋๋ค.
์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก DFS ๊ธฐ๋ฐ ์ ์/์ค์/ํ์ ์ํ์ BFS ๊ธฐ๋ฐ ๋ ๋ฒจ ์ํ๊ฐ ์์ต๋๋ค.
๊ฐ ์ํ ๋ฐฉ์์ ํน์ง๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ์ ์์ ์ฝ๋์ ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค.
A
/ \
B C
/ \ \
D E F
์์: ๋ถ๋ชจ โ ์ผ์ชฝ ์์ โ ์ค๋ฅธ์ชฝ ์์
ํ์ฉ: ํธ๋ฆฌ ๊ตฌ์กฐ ๋ณต์ , ํํ์ ์ ์ ํ๊ธฐ๋ฒ
void preOrder(Node root) {
if (root == null) return;
System.out.print(root.value); // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
preOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
preOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
}
์คํ ๊ฒฐ๊ณผ: ABDECF
์์: ์ผ์ชฝ ์์ โ ๋ถ๋ชจ โ ์ค๋ฅธ์ชฝ ์์
ํ์ฉ: ์ด์ง ํ์ ํธ๋ฆฌ(BST) ๊ฐ ์ ๋ ฌ
void inOrder(Node root) {
if (root == null) return;
inOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
System.out.print(root.value); // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
inOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
}
์คํ ๊ฒฐ๊ณผ: DBEACF
์์: ์ผ์ชฝ ์์ โ ์ค๋ฅธ์ชฝ ์์ โ ๋ถ๋ชจ
ํ์ฉ: ํธ๋ฆฌ ์ญ์ , ํํ์ ํ์ ํ๊ธฐ๋ฒ
void postOrder(Node root) {
if (root == null) return;
postOrder(root.left); // ์ผ์ชฝ ์๋ธํธ๋ฆฌ
postOrder(root.right); // ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
System.out.print(root.value); // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ
}
์คํ ๊ฒฐ๊ณผ: DEBFCA
์์: ๋ ๋ฒจ 0 โ ๋ ๋ฒจ 1 โ ๋ ๋ฒจ 2
ํ์ฉ: ์ต๋จ ๊ฒฝ๋ก ํ์, ๊ณ์ธต๋ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
void levelOrder(Node root) {
Queue q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
Node cur = q.poll();
System.out.print(cur.value);
if (cur.left != null) q.add(cur.left);
if (cur.right != null) q.add(cur.right);
}
}
์คํ ๊ฒฐ๊ณผ: ABCDEF
| ์ํ ๋ฐฉ์ | ์๊ฐ ๋ณต์ก๋ | ๊ณต๊ฐ ๋ณต์ก๋ |
|---|---|---|
| ์ ์/์ค์/ํ์ | O(N) | O(H) |
| ๋ ๋ฒจ ์ํ | O(N) | O(W) |