π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[Coding Interview University] μ΄μ§ νμ νΈλ¦¬ : μ΄λ‘ λ° κ΅¬ν λ³Έλ¬Έ
[Coding Interview University] μ΄μ§ νμ νΈλ¦¬ : μ΄λ‘ λ° κ΅¬ν
μ§μ§μνμΉ΄ 2023. 7. 12. 00:34<λ³Έ λΈλ‘κ·Έλ μ½λ©μΈν°λ·°λν λμ Gitκ³Ό μμ μ μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€ :-)>
𫧠μ΄μ§νμνΈλ¦¬
: “λͺ¨λ μΌμͺ½ μμλ€ ≤ n < λͺ¨λ μ€λ₯Έμͺ½ μμλ€” μμ±μ λͺ¨λ λ Έλ nμ λν΄μ λ°λμ μ°Έμ΄μ΄μΌ ν¨
: λͺ¨λ λ Έλμ λν΄μ μΌμͺ½ μμλ€μ κ°μ΄ νμ¬ λ Έλ κ°λ³΄λ€ μκ±°λ κ°λλ‘ νκ³ , μ€λ₯Έμͺ½ μμλ€ κ°μ νμ¬ λ Έλμ κ°λ³΄λ€ λ°λμ 컀μΌν¨
π«§ κ· ν vs λΉκ· ν
- κ· ν
- λ λ λΈλ νΈλ¦¬
- AVL νΈλ¦¬
𫧠μμ μ΄μ§νΈλ¦¬
: νΈλ¦¬μ λͺ¨λ λμ΄μμ λ Έλκ° κ½ μ°¨ μλ μ΄μ§ νΈλ¦¬
: λ§μ§λ§ λ¨κ³λ κ½ μ°¨ μμ§ μμλ λμ§λ§ λ Έλκ° μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μ±μμ ΈμΌ ν¨
𫧠μ μ΄μ§νΈλ¦¬
: λͺ¨λ λ Έλμ μμμ΄ μκ±°λ μ νν λ κ° μλ κ²½μ°
: μμμ΄ νλλ§ μλ λ Έλκ° μ‘΄μ¬ν΄μλ μλ¨
𫧠ν¬νμ΄μ§νΈλ¦¬
: μ μ΄μ§ νΈλ¦¬μ΄λ©΄μ μμ μ΄μ§ νΈλ¦¬μΈ κ²½μ°
: λͺ¨λ λ§λ¨ λ Έλλ κ°μ λμ΄μ μμ΄μΌ νλ©°, λ§μ§λ§ λ¨κ³μμ λ Έλμ κ°μκ° μ΅λκ° λμ΄μΌ νλ€
: λ Έλμ κ°μκ° μ νν 2^K-1 (Kλ νΈλ¦¬μ λμ΄) κ°
𫧠μ΄μ§ νμ νΈλ¦¬ νμ
1. λ£¨νΈ λ Έλμ ν€μ μ°Ύκ³ μ νλ κ°μ λΉκ΅νλ€. μ°Ύκ³ μ νλ κ°μ΄λΌλ©΄ νμμ μ’ λ£νλ€
2. μ°Ύκ³ μ νλ κ°μ΄ λ£¨νΈ λ Έλμ ν€λ³΄λ€ μλ€λ©΄ μΌμͺ½ μλΈ νΈλ¦¬λ‘ νμμ μ§ννλ€
3. μ°Ύκ³ μ νλ κ°μ΄ 루νΈλ Έλμ ν€λ³΄λ€ ν¬λ€λ©΄ μ€λ₯Έμͺ½ μλΈνΈλ¦¬λ‘ νμμ μ§ννλ€
TreeNode* search(TreeNode* root, int key){
if(root == NULL){ // κ°μ μ°Ύμ§ λͺ»ν κ²½μ°
return NULL;
}
if(key == root->key){ // κ°μ μ°Ύμ
return root;
}
else if(key < root->key){ // μΌμͺ½ μλΈνΈλ¦¬ νμ
search(root->left, key);
}
else if(key > root->key){ // μ€λ₯Έμͺ½ μλΈνΈλ¦¬ νμ
search(root->right, key);
}
}
𫧠μ΄μ§ νμ νΈλ¦¬ μ½μ
1. μ½μ ν κ°μ λ£¨νΈ λ Έλμ λΉκ΅ν΄ κ°λ€λ©΄ μ€λ₯λ₯Ό λ°μνλ€ ( μ€λ³΅ κ° νμ© X )
2. μ½μ ν κ°μ΄ λ£¨νΈ λ Έλμ ν€λ³΄λ€ μλ€λ©΄ μΌμͺ½ μλΈ νΈλ¦¬λ₯Ό νμν΄μ λΉμ΄μλ€λ©΄ μΆκ°νκ³ , λΉμ΄μμ§ μλ€λ©΄ λ€μ κ°μ λΉκ΅νλ€
3. μ½μ ν κ°μ΄ 루νΈλ Έλμ ν€λ³΄λ€ ν¬λ€λ©΄ μ€λ₯Έμͺ½ μλΈνΈλ¦¬λ₯Ό νμν΄μ λΉμ΄μλ€λ©΄ μΆκ°νκ³ , λΉμ΄μμ§ μλ€λ©΄ λ€μ κ°μ λΉκ΅νλ€
Node* Insert(Node* node, int data)
{
if(node == NULL)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->Left = NULL;
newNode->Right = NULL;
return newNode;
}
else
{
if(node->data > data)
{
node->Left = Insert(node->Left, data);
}
else if(node->data < data)
{
node->Right = Insert(node->Right, data);
}
else
{
//μ€λ³΅ λ λ°μ΄ν°μ΄λ―λ‘ μΆκ°νμ§ μλλ€.
}
return node;
}
}
𫧠μ΄μ§ νμ νΈλ¦¬ μμ
1. μμ νλ €λ λ Έλκ° λ¨λ§ λ Έλ(leaf node) μΌ κ²½μ°
2. μμ νλ €λ λ Έλμ μλΈ νΈλ¦¬κ° νλμΈ κ²½μ°(μΌμͺ½ νΉμ μ€λ₯Έμͺ½ μλΈ νΈλ¦¬)
3. μμ νλ €λ λ Έλμ μλΈ νΈλ¦¬κ° λ κ°μΈ κ²½μ°
Node* FindMinNode(Node* node, Node** minNode)
{
if(node->Left == NULL)
{
*minNode = node;
node = node->Right;
return node;
}
else
{
node->Left = FindMinNode(node->Left, minNode);
return node;
}
}
Node* Delete(Node* node, int data)
{
if(node == NULL) return NULL;
if(node->data == data)
{
Node* deleteNode = node;
if(node->Left == NULL && node->Right == NULL)
{
node = NULL;
}
else if(node->Left != NULL && node->Right == NULL)
{
node = node->Left;
}
else if(node->Left == NULL && node->Right != NULL)
{
node = node->Right;
}
else
{
Node* minNode = NULL;
node->Right = FindMinNode(node->Right, &minNode);
minNode->Left = deleteNode->Left;
minNode->Right = deleteNode->Right;
node = minNode;
}
free(deleteNode);
return node;
}
else
{
if(node->data > data)
{
node->Left = Delete(node->Left, data);
}
else
{
node->Right = Delete(node->Right, data);
}
return node;
}
}