algorithms-BFS&DFS-01.md
π‘BFS ꡬννκΈ° (feat. BSTλ?)
- [Data Structures: Trees-traversals] https://replit.com/@aneagoie/Data-Structures-Trees-traversals-bfs#index.js
Binary Search Tree, BST:
A
/ \
B C
/ \ / \
D E F G
BFS: A - B - C - D - E - F - G
DFS: A - B - D - E - C - F - G
breadthFirstSearch()
breadthFirstSearch() {
let currentNode = this.root; // λ£¨νΈ λ
Έλ
let list = [];
let queue = []; // λ 벨μ νΈλνΉ
queue.push(currentNode); // νμ λ£¨νΈ λ
Έλλ₯Ό push
while(queue.length > 0) { // ν λ°°μ΄ κΈΈμ΄κ° 0 μ΄μμΌ λ
currentNode = queue.shift(); // νμ 첫λ²μ§Έ μμ΄ν
list.push(currentNode.value); // Aλ‘ μμ
if (currentNode.left) { // μΌμͺ½ μμμ μ ν
queue.push(currentNode.left);
}
if (currentNode.right) { // μ€λ₯Έμͺ½ μμμ μ ν
queue.push(currentNode.right);
}
return list;
}
}
breathFirstSearchRecursive()
breadthFirstSearchRecursive(queue, list) { // queueμ listλ₯Ό 맀κ°λ³μλ‘ λκΉ, μλλΌλ©΄ recursive μ μ΄κΈ°ν
if (!queue.length) { // ν λ°°μ΄ κΈΈμ΄κ° 0μ΄λΌλ©΄ μΌλ¦¬ 리ν΄, μ¬κ· μ’
λ£
return list;
}
let currentNode = queue.shift();
list.push(currentNode.value); // Aλ‘ μμ
if (currentNode.left) { // μΌμͺ½ μμμ μ ν
queue.push(currentNode.left);
}
if (currentNode.right) { // μ€λ₯Έμͺ½ μμμ μ ν
queue.push(currentNode.right);
}
return this.breadthFirstSearchRecursive(queue, list); // μ¬κ·
}
breadthFirstSearch(tree.root, [])
BST, Binary Search Tree, μ΄μ§ νΈλ¦¬
- λ°μ΄λ리 μμΉ νΈλ¦¬(Binary Search Tree, BST)λ μ΄μ§ νΈλ¦¬(Binary Tree)μ ν μ’ λ₯λ‘, λ€μκ³Ό κ°μ μμ±μ κ°μ΅λλ€:
κ° λ
Έλλ νλμ κ°κ³Ό μΌμͺ½ μλΈνΈλ¦¬μ μ€λ₯Έμͺ½ μλΈνΈλ¦¬λ₯Ό κ°μ§ μ μμ΅λλ€.
μΌμͺ½ μλΈνΈλ¦¬μ λͺ¨λ λ
Έλμ κ°μ ν΄λΉ λ
Έλμ κ°λ³΄λ€ μμ΅λλ€.
μ€λ₯Έμͺ½ μλΈνΈλ¦¬μ λͺ¨λ λ
Έλμ κ°μ ν΄λΉ λ
Έλμ κ°λ³΄λ€ ν½λλ€.
μ€λ³΅λ κ°μ κ°μ§λ λ
Έλλ μ‘΄μ¬νμ§ μμ΅λλ€.
μ΄λ¬ν μμ±μΌλ‘ μΈν΄ λ°μ΄λ리 μμΉ νΈλ¦¬λ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ νμ, μ½μ
, μμ ν μ μλ μλ£κ΅¬μ‘°μ
λλ€. λ°μ΄λ리 μμΉ νΈλ¦¬μ μ£Όμ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€:
- νμ: νΈλ¦¬μ 루νΈλΆν° μμνμ¬ κ°μ μ°Ύκ±°λ, ν΄λΉ κ°μ κ°μ§ λ Έλκ° μμ κ²½μ° μ΄μ§ νμμ ν΅ν΄ κ°μ μ°Ύμ΅λλ€. μ΄μ§ νμμ νμ¬ λ Έλμ κ°κ³Ό μ°Ύκ³ μ νλ κ°μ λΉκ΅νμ¬ μΌμͺ½ λλ μ€λ₯Έμͺ½ μλΈνΈλ¦¬λ‘ μ΄λνλ©΄μ νμν©λλ€. μ΄λ‘ μΈν΄ νμ μκ°μ O(log n)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λλ€.
- μ½μ : νΈλ¦¬μ μλ‘μ΄ κ°μ μ½μ ν λλ νμμ ν΅ν΄ κ°μ μ½μ ν μμΉλ₯Ό μ°Ύμ νμ ν΄λΉ μμΉμ λ Έλλ₯Ό μ½μ ν©λλ€. μ΄λ μ½μ μμΉλ μ μ ν κ°μ μ μ§νκΈ° μν΄ μ΄μ§ νμμ μμ±μ μ μ§ν΄μΌ ν©λλ€.
- μμ : νΈλ¦¬μμ κ°μ μμ ν λλ μΈ κ°μ§ κ²½μ°λ₯Ό κ³ λ €ν΄μΌ ν©λλ€. 첫째, μμ ν λ Έλκ° λ¨λ§ λ ΈλμΈ κ²½μ° ν΄λΉ λ Έλλ₯Ό κ·Έλ₯ μμ ν©λλ€. λμ§Έ, μμ ν λ Έλκ° νλμ μλΈνΈλ¦¬λ₯Ό κ°λ κ²½μ° μμ ν λ Έλλ₯Ό κ·Έ μλΈνΈλ¦¬λ‘ λ체ν©λλ€. μ μ§Έ, μμ ν λ Έλκ° λ κ°μ μλΈνΈλ¦¬λ₯Ό κ°λ κ²½μ° μμ ν λ Έλμ μΌμͺ½ μλΈνΈλ¦¬μμ κ°μ₯ ν° κ°μ μ°Ύμ μμ ν λ Έλλ‘ λ체νκ±°λ, μ€λ₯Έμͺ½ μλΈνΈλ¦¬μμ κ°μ₯ μμ κ°μ μ°Ύμ λ체ν©λλ€.
currentNode.left
-
currentNode.left
λ μ΄μ§ νΈλ¦¬μμ νμ¬ λ Έλ(currentNode
)μ μΌμͺ½ μμ λ Έλλ₯Ό λνλ΄λ λ§ν¬λ ν¬μΈν°μ λλ€. μ΄ λ§ν¬λ νμ¬ λ Έλμ μΌμͺ½ μμ λ Έλλ₯Ό μ°κ²°ν©λλ€. - μ΄μ§ νΈλ¦¬μ κ° λ Έλλ μ΅λ λ κ°μ μμμ κ°μ§ μ μμΌλ―λ‘, **currentNode.left
**λ μΌμͺ½ μμ λ Έλκ° μ‘΄μ¬ν κ²½μ° ν΄λΉ λ Έλλ₯Ό κ°λ¦¬ν€λ λ§ν¬μ λλ€. μΌμͺ½ μμ λ Έλκ° μμ κ²½μ° **currentNode.left
**λ λ³΄ν΅ **null
**μ΄λ λΉμ΄ μλ κ°μ κ°μ§κ² λ©λλ€. - μ΄ λ§ν¬λ₯Ό ν΅ν΄ μΌμͺ½ μμ λ Έλμ μ κ·Όν μ μμΌλ©°, μΌμͺ½ μμ λ Έλμ κ°μ΄λ ν΄λΉ μμ λ Έλμ νμ μμ λ Έλμ μ κ·Όν μλ μμ΅λλ€. μ΄λ¬ν μ κ·Όμ ν΅ν΄ νΈλ¦¬μ ꡬ쑰λ₯Ό νμνκ³ , μνλ μμ μ μνν μ μμ΅λλ€. -
μλλ μ΄μ§ νΈλ¦¬μμ **
currentNode.left
**λ₯Ό μκ°μ μΌλ‘ ννν μμμ λλ€:A / \ B C / \ D E currentNode: B (currentNode) B / \ (currentNode.left) D E
- μ μμμμ **
currentNode
**κ° BμΈ κ²½μ°, **currentNode.left
**λ Dλ₯Ό κ°λ¦¬ν΅λλ€. λ°λΌμ **currentNode.left
**λ₯Ό ν΅ν΄ Bμ μΌμͺ½ μμ λ ΈλμΈ Dμ μ κ·Όν μ μμ΅λλ€.
- μ μμμμ **
currentNode.right
-
currentNode.right
λ μ΄μ§ νΈλ¦¬μμ νμ¬ λ Έλ(currentNode
)μ μ€λ₯Έμͺ½ μμ λ Έλλ₯Ό λνλ΄λ λ§ν¬λ ν¬μΈν°μ λλ€. μ΄ λ§ν¬λ νμ¬ λ Έλμ μ€λ₯Έμͺ½ μμ λ Έλλ₯Ό μ°κ²°ν©λλ€.- μ΄μ§ νΈλ¦¬μ κ° λ
Έλλ μ΅λ λ κ°μ μμμ κ°μ§ μ μμΌλ―λ‘, **
currentNode.right
**λ μ€λ₯Έμͺ½ μμ λ Έλκ° μ‘΄μ¬ν κ²½μ° ν΄λΉ λ Έλλ₯Ό κ°λ¦¬ν€λ λ§ν¬μ λλ€. μ€λ₯Έμͺ½ μμ λ Έλκ° μμ κ²½μ° **currentNode.right
**λ λ³΄ν΅ **null
**μ΄λ λΉμ΄ μλ κ°μ κ°μ§κ² λ©λλ€. - μ΄ λ§ν¬λ₯Ό ν΅ν΄ μ€λ₯Έμͺ½ μμ λ Έλμ μ κ·Όν μ μμΌλ©°, μ€λ₯Έμͺ½ μμ λ Έλμ κ°μ΄λ ν΄λΉ μμ λ Έλμ νμ μμ λ Έλμ μ κ·Όν μλ μμ΅λλ€. μ΄λ¬ν μ κ·Όμ ν΅ν΄ νΈλ¦¬μ ꡬ쑰λ₯Ό νμνκ³ , μνλ μμ μ μνν μ μμ΅λλ€.
- μ΄μ§ νΈλ¦¬μ κ° λ
Έλλ μ΅λ λ κ°μ μμμ κ°μ§ μ μμΌλ―λ‘, **
-
μλλ μ΄μ§ νΈλ¦¬μμ **
currentNode.right
**λ₯Ό μκ°μ μΌλ‘ ννν μμμ λλ€:A / \ B C / \ D E currentNode: B (currentNode) B / \ D E \ (currentNode.right) E's right
- μ μμμμ **
currentNode
**κ° BμΈ κ²½μ°, **currentNode.right
**λ Eλ₯Ό κ°λ¦¬ν΅λλ€. λ°λΌμ **currentNode.right
**λ₯Ό ν΅ν΄ Bμ μ€λ₯Έμͺ½ μμ λ ΈλμΈ Eμ μ κ·Όν μ μμ΅λλ€. λν, Eμ μ€λ₯Έμͺ½ μμ λ ΈλμΈ E's rightμλ **currentNode.right.right
**λ₯Ό ν΅ν΄ μ κ·Όν μ μμ΅λλ€.
- μ μμμμ **