😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[Coding Interview University] 이진 탐색 트리 : 이둠 및 κ΅¬ν˜„ λ³Έλ¬Έ

πŸ‘©‍πŸ’» 컴퓨터 ꡬ쑰/Computer Science

[Coding Interview University] 이진 탐색 트리 : 이둠 및 κ΅¬ν˜„

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 7. 12. 00:34
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” μ½”λ”©μΈν„°λ·°λŒ€ν•™ λ‹˜μ˜ 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;
    }
}

 

728x90
λ°˜μ‘ν˜•
Comments