Binary Search Tree βπ»
μμ λ Έλκ° μ΅λ λ κ°μΈ λ Έλλ€λ‘ ꡬμ±λ νΈλ¦¬, μ΄μ§ νμ νΈλ¦¬λ λͺ¨λ μΌμͺ½ μμμ κ°μ΄ 루νΈλ λΆλͺ¨λ³΄λ€ μκ³ , λͺ¨λ μ€λ₯Έμͺ½ μμμ κ°μ΄ 루νΈλ λΆλͺ¨λ³΄λ€ ν° κ°μ κ°μ§λ κ²μ΄ νΉμ§
μ μ΄μ§ νΈλ¦¬(Full binary tree) : κ° λ Έλκ° 0κ° νΉμ 2κ°μ μμ λ Έλλ₯Ό κ°λλ€.
ν¬ν μ΄μ§ νΈλ¦¬(Perfect binary tree) : μ μ΄μ§ νΈλ¦¬μ΄λ©΄μ μμ μ΄μ§νΈλ¦¬μΈ κ²½μ°, 리ν λ Έλμ λ λ²¨μ΄ λμΌνκ³ , λͺ¨λ λ λ²¨μ΄ κ°λ μ±μμ Έ μλ νΈλ¦¬
μμ μ΄μ§ νΈλ¦¬(Complete binary tree) : λ§μ§λ§ λ 벨μ μ μΈν λͺ¨λ λ Έλκ° κ°λ μ°¨ μμ΄μΌ νκ³ , λ§μ§λ§ λ 벨μ λ Έλλ μ λΆ μ°¨ μμ§ μμλ λμ§λ§ μΌμͺ½μ΄ μ±μμ ΈμΌ νλ€.
class BinarySearchTree {
constructor(value) {
// constructorλ‘ λ§λ κ°μ²΄λ μ΄μ§ νμ νΈλ¦¬μ Nodeκ° λ©λλ€.
this.value = value;
this.left = null;
this.right = null;
}
// μ΄μ§ νμ νΈλ¦¬μ μ½μ
νλ λ©μλλ₯Ό λ§λλλ€.
insert(value) {
// μ
λ ₯κ°μ κΈ°μ€μΌλ‘, νμ¬ λ
Έλμ κ°λ³΄λ€ ν¬κ±°λ μμ κ²μ λν μ‘°κ±΄λ¬Έμ΄ μμ΄μΌ ν©λλ€.
// λ³΄λ€ μλ€λ©΄, Nodeμ μΌμͺ½μ΄ λΉμ΄ μλμ§ νμΈ ν κ°μ λ£μ΅λλ€.
if (value < this.value) {
if (this.left === null) {
this.left = new BinarySearchTree(value);
} else {
// TODO: λΉμ΄ μμ§ μλ€λ©΄ ν΄λΉ λ
Έλλ‘ μ΄λνμ¬ μ²μλΆν° λ€μ ν¬κ±°λ μμ κ²μ λν 쑰건μ λ¬Όμ΄λ³΄μμΌ ν κ²μ
λλ€.
// TIP: μ¬κ·ν¨μλ₯Ό μ¬μ©ν©λλ€.
this.left.insert(value);
}
// λ³΄λ€ ν¬λ€λ©΄, Nodeμ μ€λ₯Έμͺ½μ΄ λΉμ΄ μλμ§ νμΈ ν κ°μ λ£μ΅λλ€.
} else if (value > this.value) {
if (this.right === null) {
this.right = new BinarySearchTree(value);
} else {
// TODO: λΉμ΄ μμ§ μλ€λ©΄ ν΄λΉ λ
Έλλ‘ μ΄λνμ¬ μ²μλΆν° λ€μ ν¬κ±°λ μμ κ²μ λν 쑰건μ λ¬Όμ΄λ³΄μμΌ ν κ²μ
λλ€.
// TIP: μ¬κ·ν¨μλ₯Ό μ¬μ©ν©λλ€.
this.right.insert(value);
}
//κ·Έκ²λ μλλΌλ©΄, μ
λ ₯κ°μ΄ νΈλ¦¬μ λ€μ΄ μλ κ²½μ°μ
λλ€.
} else {
// μ무κ²λ νμ§ μμ΅λλ€.
return;
}
}
// μμ ꡬννλ νΈλ¦¬μ λΉν΄ μ΄μ§ νμ νΈλ¦¬λ μ
λ ₯κ°κ³Ό νΈλ¦¬ λ
Έλμ κ°μ ν¬κΈ°λ₯Ό λΉκ΅νκ³ μμ΅λλ€. μ κ·Έλ° κ²μΌκΉμ?
// μ΄μ§ νμ νΈλ¦¬ μμ ν΄λΉ κ°μ΄ ν¬ν¨λμ΄ μλμ§ νμΈνλ λ©μλλ₯Ό λ§λλλ€.
contains(value) {
// TODO: κ°μ΄ ν¬ν¨λμ΄ μλ€λ©΄ trueλ₯Ό λ°ννμΈμ.
if (this.value === value) {
return true;
}
// μ
λ ₯κ°μ κΈ°μ€μΌλ‘ νμ¬ λ
Έλμ κ°λ³΄λ€ μμμ§ νλ³νλ μ‘°κ±΄λ¬Έμ΄ μμ΄μΌ ν©λλ€.
if (value < this.value) {
// TODO: νμ¬ λ
Έλμ μΌμͺ½μ΄ λΉμ΄ μμ§ μκ³ , λ
Έλμ κ°μ΄ μ
λ ₯κ°κ³Ό μΌμΉνλ©΄ trueλ₯Ό λ°νν©λλ€.
if(this.left !== null && this.left.value === value){
return true;
}else {
this.contains(this.left.value);
}
// TODO:μΌμΉνμ§ μλ€λ©΄ μΌμͺ½ λ
Έλλ‘ μ΄λνμ¬ λ€μ νμν©λλ€.
}
// μ
λ ₯κ°μ κΈ°μ€μΌλ‘ νμ¬ λ
Έλμ κ°λ³΄λ€ ν°μ§ νλ³νλ μ‘°κ±΄λ¬Έμ΄ μμ΄μΌ ν©λλ€.
if (value > this.value) {
// TODO: νμ¬ λ
Έλμ μ€λ₯Έμͺ½μ΄ λΉμ΄ μμ§ μκ³ , λ
Έλμ κ°μ΄ μ
λ ₯κ°κ³Ό μΌμΉνλ©΄ trueλ₯Ό λ°νν©λλ€.
if(this.right !== null && this.right.value === value){
return true;
}else {
this.contains(this.right.value);
}
// TODO:μΌμΉνμ§ μλ€λ©΄ μ€λ₯Έμͺ½ λ
Έλλ‘ μ΄λνμ¬ λ€μ νμν©λλ€.
}
// μλ€λ©΄ falseλ₯Ό λ°νν©λλ€.
return false;
}
/*
νΈλ¦¬μ μνμ λν΄ κ΅¬νμ ν©λλ€.
μ§κΈ λ§λλ €κ³ νλ μ΄ μν λ©μλλ λ¨μ§ μνλ§ νλ κ²μ΄ μλ, ν¨μλ₯Ό 맀κ°λ³μλ‘ λ°μ μ½λ°± ν¨μμ κ°μ μ μ©μν¨ κ²μ μνν΄μΌ ν©λλ€.
μ μ μνλ₯Ό ν΅ν΄ μ΄λ»κ² νμνλμ§ μ΄ν΄λ₯Ό νλ€λ©΄ μ€μμ νμ μνλ μ½κ² λ€κ°μ¬ κ²μ
λλ€.
*/
// μ΄μ§ νμ νΈλ¦¬λ₯Ό μ μ μννλ λ©μλλ₯Ό λ§λλλ€.
preorder(callback) {
callback(this.value);
if (this.left) {
this.left.preorder(callback);
};
if (this.right) {
this.right.preorder(callback);
};
}
// μ΄μ§ νμ νΈλ¦¬λ₯Ό μ€μ μννλ λ©μλλ₯Ό λ§λλλ€.
inorder(callback) {
//TODO: μ μ μνλ₯Ό λ°νμΌλ‘ μ€μ μνλ₯Ό ꡬννμΈμ.
if(this.left){
this.left.inorder(callback);
}
callback(this.value);
if(this.right){
this.right.inorder(callback);
}
}
// μ΄μ§ νμ νΈλ¦¬λ₯Ό νμ μννλ λ©μλλ₯Ό λ§λλλ€.
postorder(callback) {
//TODO: μ μ μνλ₯Ό λ°νμΌλ‘ νμ μνλ₯Ό ꡬννμΈμ.
if(this.left){
this.left.postorder(callback);
}
if(this.right){
this.right.postorder(callback);
}
callback(this.value);
}
}