π¦ treeDFS
π λ¬Έμ νμ΄
π² νκ³
λ μ΄ κ°μλ‘ μ¬νλλ μκ³ λ¦¬μ¦..ν±μμ΄ λΆμ‘±ν μλ£κ΅¬μ‘°λΆμμ€λ ₯ λ° λ°©λν μ...μμ κΈΈμ μμ΄λ²λ¦° λλ..μ΄κ±° λμ΄λ λ무 μ¬νκ±° μλκ°μ? κ·Έλλ μ κ·μμ
μ μμΌλ λ°λΌκ° μ λ°μ μλ μν©μΈλ° λΆλ΄λΆλ΄ ꡬκΈλ§ νκ³ νΈλ¦¬κ΅¬μ‘° λΆν° DFS νμ΄λ³΄μμ§λ§ λλ체 λ¬΄μ¨ μ리 νλ 건κ°μ? νλ λλμ λ°λ μμ€μ..λ
Όλ¬Έμ΄ λμλ€λ λ°λν μμμ λ£κ³ μ°Έκ³ νμλ€. 1λ¬ μ λ λ¨μλλ° μμΌλ‘ κ±±μ μ΄ νμ°..μν μ μμμ§ μλ¬Έμ 1ν¨λ₯Ό λ²μ¨ λ§μ λλμ΄λΌκ³ λ ν κΉ? λλ§κ°λ©΄ λΆμ‘μΌλ‘ κ°κΊΌλ€...κ°μ§λ§λΌκ³ νμλ λΆλ€ 보면 μ€λλ λλ 묡묡ν λ΄ κ°κΈΈ κ±Έμ΄κ°λ³Έλ€...
π³ μκ³ λμ΄κ°κΈ°
π νΈλ¦¬(Tree)μ κ°λ
νΈλ¦¬λ λ
Έλλ‘ μ΄λ£¨μ΄μ§ μλ£ κ΅¬μ‘°
1).νΈλ¦¬λ νλμ λ£¨νΈ λ
Έλλ₯Ό κ°λλ€.
2).λ£¨νΈ λ
Έλλ 0κ° μ΄μμ μμ λ
Έλλ₯Ό κ°κ³ μλ€.
3). κ·Έ μμ λ
Έλ λν 0κ° μ΄μμ μμ λ
Έλλ₯Ό κ°κ³ μκ³ , μ΄λ λ°λ³΅μ μΌλ‘ μ μλλ€.
- λ
Έλ(node)λ€κ³Ό λ
Έλλ€μ μ°κ²°νλ κ°μ (edge)λ€λ‘ ꡬμ±λμ΄ μλ€.
- νΈλ¦¬μλ μ¬μ΄ν΄(cycle)μ΄ μ‘΄μ¬ν μ μλ€.
- λ
Έλλ€μ νΉμ μμλ‘ λμ΄λ μλ μκ³ κ·Έλ΄ μ μμ μλ μλ€.
- κ° λ
Έλλ λΆλͺ¨ λ
Έλλ‘μ μ°κ²°μ΄ μμ μλ μκ³ μμ μλ μλ€.
- κ° λ
Έλλ μ΄λ€ μλ£νμΌλ‘λ νν κ°λ₯νλ€.
class Node {
public String name;
public Node[] children;
}
- λΉμ ν μλ£κ΅¬μ‘°λ‘ κ³μΈ΅μ κ΄κ³λ₯Ό νννλ€. Ex) λλ ν°λ¦¬ ꡬ쑰, μ‘°μ§λ
- κ·Έλνμ ν μ’
λ₯
- μ¬μ΄ν΄(cycle)μ΄ μλ νλμ μ°κ²° κ·Έλν(Connected Graph)
- λλ DAG(Directed Acyclic Graph, λ°©ν₯μ±μ΄ μλ λΉμν κ·Έλν)μ ν μ’
λ₯ μ΄λ€.
π±Treeμ κ΄λ ¨λ μ©μ΄
- λ£¨νΈ λ
Έλ(root node): λΆλͺ¨κ° μλ λ
Έλ, νΈλ¦¬λ νλμ λ£¨νΈ λ
Έλλ§μ κ°μ§λ€.
- λ¨λ§ λ
Έλ(leaf node): μμμ΄ μλ λ
Έλ, βλ§λ¨ λ
Έλβ λλ βμ λ
ΈλβλΌκ³ λ λΆλ₯Έλ€.
- λ΄λΆ(internal) λ
Έλ: λ¨λ§ λ
Έλκ° μλ λ
Έλ
- κ°μ (edge): λ
Έλλ₯Ό μ°κ²°νλ μ (link, branch λΌκ³ λ λΆλ¦)
- νμ (sibling): κ°μ λΆλͺ¨λ₯Ό κ°μ§λ λ
Έλ
- λ
Έλμ ν¬κΈ°(size): μμ μ ν¬ν¨ν λͺ¨λ μμ λ
Έλμ κ°μ
- λ
Έλμ κΉμ΄(depth): 루νΈμμ μ΄λ€ λ
Έλμ λλ¬νκΈ° μν΄ κ±°μ³μΌ νλ κ°μ μ μ
- λ
Έλμ λ 벨(level): νΈλ¦¬μ νΉμ κΉμ΄λ₯Ό κ°μ§λ λ
Έλμ μ§ν©
- λ
Έλμ μ°¨μ(degree): νμ νΈλ¦¬ κ°μ / κ°μ μ (degree) = κ° λ
Έλκ° μ§λ κ°μ§μ μ
- νΈλ¦¬μ μ°¨μ(degree of tree): νΈλ¦¬μ μ΅λ μ°¨μ
- νΈλ¦¬μ λμ΄(height): λ£¨νΈ λ
Έλμμ κ°μ₯ κΉμν μλ λ
Έλμ κΉμ΄
πΏνΈλ¦¬(Tree)μ νΉμ§
- κ·Έλνμ ν μ’
λ₯μ΄λ€. βμ΅μ μ°κ²° νΈλ¦¬β λΌκ³ λ λΆλ¦°λ€.
- νΈλ¦¬λ κ³μΈ΅ λͺ¨λΈ μ΄λ€.
- νΈλ¦¬λ DAG(Directed Acyclic Graphs, λ°©ν₯μ±μ΄ μλ λΉμν κ·Έλν)μ ν μ’
λ₯μ΄λ€.
- loopλ circuitμ΄ μλ€. λΉμ°ν self-loopλ μλ€.
- μ¦, μ¬μ΄ν΄μ΄ μλ€.
- λ
Έλκ° Nκ°μΈ νΈλ¦¬λ νμ N-1κ°μ κ°μ (edge)μ κ°μ§λ€.
- μ¦, κ°μ μ νμ (μ μ μ κ°μ - 1) λ§νΌμ κ°μ§λ€.
- 루νΈμμ μ΄λ€ λ
Έλλ‘ κ°λ κ²½λ‘λ μ μΌνλ€.
- μμμ λ λ
Έλ κ°μ κ²½λ‘λ μ μΌνλ€. μ¦, λ κ°μ μ μ μ¬μ΄μ λ°λμ 1κ°μ κ²½λ‘λ§μ κ°μ§λ€.
- ν κ°μ λ£¨νΈ λ
Έλλ§μ΄ μ‘΄μ¬νλ©° λͺ¨λ μμ λ
Έλλ ν κ°μ λΆλͺ¨ λ
Έλλ§μ κ°μ§λ€.
- λΆλͺ¨-μμ κ΄κ³μ΄λ―λ‘ νλ¦μ top-bottom μλλ©΄ bottom-topμΌλ‘ μ΄λ£¨μ΄μ§λ€.
- μνλ Pre-order, In-order μλλ©΄ Post-orderλ‘ μ΄λ£¨μ΄μ§λ€. μ΄ 3κ°μ§ λͺ¨λ DFS/BFS μμ μλ€.
- νΈλ¦¬λ μ΄μ§ νΈλ¦¬, μ΄μ§ νμ νΈλ¦¬, κ· ν νΈλ¦¬(AVL νΈλ¦¬, red-black νΈλ¦¬), μ΄μ§ ν(μ΅λν, μ΅μν) λ±μ΄ μλ€.
βοΈνΈλ¦¬(Tree)μ μ’
λ₯
μ΄μ§ νΈλ¦¬(Binary Tree)
νΈλ¦¬λ₯Ό ꡬμ±νλ λ
Έλμ branchκ°μλ 0κ°, 1κ°, 2κ°, 3κ°, ... λ± μ¬λ¬ κ°κ° λ μ μμ§λ§, μ΄μ§νΈλ¦¬λ λ€λ₯΄λ€. μ΄μ§νΈλ¦¬λ λͺ¨λ λ
Έλκ° μ΅λ 2κ°μ μλΈνΈλ¦¬λ₯΄ κ°μ§κ³ μλ νΈλ¦¬κ³ , μλΈνΈλ¦¬ λν λͺ¨λ μ΄μ§ νΈλ¦¬μ΄λ€. μ¦ branchκ° μ΅λ 2κ°μΈ λ
Έλλ§ κ΅¬μ±λλ νΈλ¦¬λΌλ λ»μ΄λ€.
κ°λ¨νκ² μ 리νμλ©΄
- λΆλͺ¨ λ
Έλλ³΄λ€ μΌμͺ½ μμμ λ
Έλκ° μλ€
- λΆλͺ¨ λ
Έλλ³΄λ€ μ€λ₯Έμͺ½ μμμ λ
Έλκ° ν¬λ€
- κ°μ λ°μ΄ν° κ°μ κ°μ§λ λ
Έλλ μλ€. (λ°μ΄ν° μ€λ³΅ X)
πνΈλ¦¬(Tree)μ μν
νΈλ¦¬ μνλ, νΈλ¦¬μλ£κ΅¬μ‘°μ ν¬ν¨λ λ
Έλλ€μ νΉμ ν λ°©λ²μΌλ‘ ν λ²μ© λ°©λ¬Ένλ λ°©λ²μ΄λ€.
μ΄λ₯Ό ν΅ν΄μ μ 보λ₯Ό μκ°μ μΌλ‘ νμΈν μ μλ€. λ°λ‘ μμ μλ μ΄μ§νΈλ¦¬μ μ΄λ―Έμ§μ λ
ΈλλΆν° A,B,Cλ‘ μλ‘ λ€μ΄λ³Έλ€λ©΄,
- μ μ μν(Pre-order traversal) : λ
Έλ, μΌμͺ½μμ , μ€λ₯Έμͺ½ μμ μμλ‘ λ°©λ¬Ένλ μν λ°©λ² A -> B -> C
- μ€μ μν(In-order traversal) : μΌμͺ½ μμ, λ
Έλ, μ€λ₯Έμͺ½ μμ μμλ‘ λ°©λ¬Ένλ μν λ°©λ² B -> A -> C
- νμ μν (Post-order traverl) : μΌμͺ½ μμ, μ€λ₯Έμͺ½ μμ, λ
Έλ μμλ‘ λ°©λ¬Ένλ μν λ°©λ² B -> C -> A
πνΈλ¦¬(Tree)μ ꡬν λ°©λ²
κΈ°λ³Έμ μΌλ‘ νΈλ¦¬λ κ·Έλνμ ν μ’
λ₯μ΄λ―λ‘ κ·Έλνμ ꡬν λ°©λ²(μΈμ 리μ€νΈ λλ μΈμ λ°°μ΄)μΌλ‘ ꡬνν μ μλ€.
μΈμ λ°°μ΄ μ΄μ©
- 1μ°¨μ λ°°μ΄μ μμ μ λΆλͺ¨ λ
Έλλ§ μ μ₯νλ λ°©λ²
νΈλ¦¬λ λΆλͺ¨ λ
Έλλ₯Ό 0κ° λλ 1κ°λ₯Ό κ°μ§κΈ° λλ¬Έ
λΆλͺ¨ λ
Έλλ₯Ό 0κ°: λ£¨νΈ λ
Έλ
- μ΄μ§ νΈλ¦¬μ κ²½μ°, 2μ°¨μ λ°°μ΄μ μμ λ
Έλλ₯Ό μ μ₯νλ λ°©λ²
μ΄μ§ νΈλ¦¬λ κ° λ
Έλκ° μ΅λ λ κ°μ μμμ κ°λ νΈλ¦¬μ΄κΈ° λλ¬Έ
Ex) A[i][0]: μΌμͺ½ μμ λ
Έλ, A[i][1]: μ€λ₯Έμͺ½ μμ λ
Έλ
μΈμ 리μ€νΈ μ΄μ©
- κ°μ€μΉκ° μλ νΈλ¦¬μ κ²½μ°
ArrayList< ArrayList > list = new ArrayList<>();
- κ°μ€μΉκ° μλ νΈλ¦¬μ κ²½μ°
1) class Node { int num, dist; // λ
Έλ λ²νΈ, 거리 } μ μ
2) ArrayList[] list = new ArrayList[μ μ μ μ + 1];
κ·Έλν(Graph)
- κ·Έλν(graph)λ μ¬λ¬Όμ μ μ (vertex)κ³Ό κ°μ (edge)μΌλ‘ λνλ΄κΈ° μν λꡬλ€. β’ κ·Έλνλλκ°μ§λ°©μμΌλ‘ꡬνν μμλ€.
κ·Έλν νμ
νλμ μ μ μΌλ‘λΆν° μμνμ¬ μ°¨λ‘λλ‘ λͺ¨λ μ μ λ€μ ν λ²μ© λ°©λ¬Ένλ κ²
Ex) νΉμ λμμμ λ€λ₯Έ λμλ‘ κ° μ μλμ§ μλμ§, μ μ νλ‘μμ νΉμ λ¨μμ λ¨μκ° μλ‘ μ°κ²°λμ΄ μλμ§
https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html
π±κΉμ΄ μ°μ νμ (DFS, Depth First Search)
λ£¨νΈ λ
Έλ νΉμ λ€λ₯Έ μμμ λ
Έλμμ μμν΄μ λ€μ λΆκΈ°(branch) λ‘ λμ΄κ°κΈ° μ μ ν΄λΉ λΆκΈ°λ₯Ό μλ²½νκ² νμνλ λ°©λ². μ¦, λκ² νμνκΈ° μ μ κΉκ² νμνλ λ°©λ²μ΄λ€.
- λ―Έλ‘λ₯Ό νμν λ ν λ°©ν₯μΌλ‘ κ° μ μμ λκΉμ§ κ³μ κ°λ€κ° λ μ΄μ κ° μ μκ² λλ©΄ λ€μ κ°μ₯ κ°κΉμ΄ κ°λ¦ΌκΈΈλ‘ λμμμ μ΄κ³³μΌλ‘λΆν° λ€λ₯Έ λ°©ν₯μΌλ‘ λ€μ νμμ μ§ννλ λ°©λ²κ³Ό μ μ¬νλ€.
- μ¦, λκ²(wide) νμνκΈ° μ μ κΉκ²(deep) νμνλ κ²μ΄λ€.
- μ¬μ©νλ κ²½μ°: λͺ¨λ λ
Έλλ₯Ό λ°©λ¬Έ νκ³ μ νλ κ²½μ°μ μ΄ λ°©λ²μ μ ννλ€.
- κΉμ΄ μ°μ νμ(DFS)μ΄ λλΉ μ°μ νμ(BFS)λ³΄λ€ μ’ λ κ°λ¨νλ€.
- λ¨μ κ²μ μλ μ체λ λλΉ μ°μ νμ(BFS)μ λΉν΄μ λ리λ€.
π± κΉμ΄ μ°μ νμ(DFS)μ νΉμ§
- μκΈ° μμ μ νΈμΆνλ μν μκ³ λ¦¬μ¦μ νν λ₯Ό κ°μ§κ³ μλ€.
- μ μ μν(Pre-Order Traversals)λ₯Ό ν¬ν¨ν λ€λ₯Έ ννμ νΈλ¦¬ μνλ λͺ¨λ DFSμ ν μ’
λ₯μ΄λ€.
- μ΄ μκ³ λ¦¬μ¦μ ꡬνν λ κ°μ₯ ν° μ°¨μ΄μ μ, κ·Έλν νμμ κ²½μ° μ΄λ€ λ
Έλλ₯Ό λ°©λ¬Ένμλμ§ μ¬λΆλ₯Ό λ°λμ - κ²μ¬ ν΄μΌ νλ€λ κ²μ΄λ€.
μ΄λ₯Ό κ²μ¬νμ§ μμ κ²½μ° λ¬΄ν루νμ λΉ μ§ μνμ΄ μλ€.
π± κΉμ΄ μ°μ νμ(DFS)μ κ³Όμ
1.a λ
Έλ(μμ λ
Έλ)λ₯Ό λ°©λ¬Ένλ€.
- λ°©λ¬Έν λ
Έλλ λ°©λ¬Ένλ€κ³ νμνλ€.
- aμ μΈμ ν λ
Έλλ€μ μ°¨λ‘λ‘ μννλ€.
- aμ μΈμ ν λ
Έλκ° μλ€λ©΄ μ’
λ£νλ€.
- aμ μ΄μν λ
Έλ bλ₯Ό λ°©λ¬Ένλ€λ©΄, aμ μΈμ ν λ λ€λ₯Έ λ
Έλλ₯Ό λ°©λ¬ΈνκΈ° μ μ bμ μ΄μ λ
Έλλ€μ μ λΆ λ°©λ¬Έν΄μΌ νλ€.
- bλ₯Ό μμ μ μ μΌλ‘ DFSλ₯Ό λ€μ μμνμ¬ bμ μ΄μ λ
Έλλ€μ λ°©λ¬Ένλ€.
- bμ λΆκΈ°λ₯Ό μ λΆ μλ²½νκ² νμνλ€λ©΄ λ€μ aμ μΈμ ν μ μ λ€ μ€μμ μμ§ λ°©λ¬Έμ΄ μ λ μ μ μ μ°Ύλλ€.
- μ¦, bμ λΆκΈ°λ₯Ό μ λΆ μλ²½νκ² νμν λ€μμΌ aμ λ€λ₯Έ μ΄μ λ
Έλλ₯Ό λ°©λ¬Έν μ μλ€λ λ»μ΄λ€.
- μμ§ λ°©λ¬Έμ΄ μ λ μ μ μ΄ μμΌλ©΄ μ’
λ£νλ€.
- μμΌλ©΄ λ€μ κ·Έ μ μ μ μμ μ μ μΌλ‘ DFSλ₯Ό μμνλ€
π± κΉμ΄ μ°μ νμ(DFS)μ ꡬν
ꡬν λ°©λ² 2κ°μ§
1. μν νΈμΆ μ΄μ©
2. λͺ
μμ μΈ μ€ν μ¬μ©
λͺ
μμ μΈ μ€νμ μ¬μ©νμ¬ λ°©λ¬Έν μ μ λ€μ μ€νμ μ μ₯νμλ€κ° λ€μ κΊΌλ΄μ΄ μμ
νλ€.
μν νΈμΆμ μ΄μ©ν DFS μμ¬μ½λ(pseudocode)
π± κΉμ΄ μ°μ νμ(DFS)μ μκ° λ³΅μ‘λ
- DFSλ κ·Έλν(μ μ μ μ: N, κ°μ μ μ: E)μ λͺ¨λ κ°μ μ μ‘°ννλ€.
- μΈμ 리μ€νΈλ‘ ννλ κ·Έλν: O(N+E)
- μΈμ νλ ¬λ‘ ννλ κ·Έλν: O(N^2)
- μ¦, κ·Έλν λ΄μ μ μ μ«μμ κ°μ λ§μ κ°μ§λ ν¬μ κ·Έλν(Sparse Graph) μ κ²½μ° μΈμ νλ ¬λ³΄λ€ μΈμ 리μ€νΈλ₯Ό μ¬μ©νλ κ²μ΄ μ 리νλ€.