IT/Computer Science

[Leetcode/Tree] 501. Find Mode in Binary Search Tree

Diana Kang 2025. 3. 14. 23:07

  • mode: μ΅œλΉˆκ°’

πŸ”Ή Binary Search Tree(이진 탐색 트리, BST)λž€?

 

  • 이진 트리의 ν•œ μ’…λ₯˜μ΄λ©°, λ…Έλ“œμ˜ λ°°μΉ˜μ— νŠΉμ •ν•œ κ·œμΉ™μ΄ μ μš©λœλ‹€:
    • μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ λͺ¨λ“  값은 ν˜„μž¬ λ…Έλ“œλ³΄λ‹€ μž‘μ•„μ•Ό ν•œλ‹€.
    • 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ λͺ¨λ“  값은 ν˜„μž¬ λ…Έλ“œλ³΄λ‹€ 컀야 ν•œλ‹€.
  • 이 κ·œμΉ™ 덕뢄에 탐색(검색), μ‚½μž…, μ‚­μ œ λ“±μ˜ 연산이 효율적(평균 O(log n))으둜 μˆ˜ν–‰λœλ‹€.

 

좜처: https://yoongrammer.tistory.com/71

 


πŸ”Ή μ€‘μœ„ 순회(In-order Traversal)λž€?

이진 탐색 트리(BST)μ—μ„œ μ€‘μœ„ 순회(In-order Traversal) λ₯Ό μˆ˜ν–‰ν•˜λ©΄ 값이 μ˜€λ¦„μ°¨μˆœ(ascending order)으둜 μ •λ ¬λœ μˆœμ„œλ‘œ λ°©λ¬Έλœλ‹€.

🌟 μ€‘μœ„ 순회 μˆœμ„œ

  1. μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬ 탐색
  2. ν˜„μž¬ λ…Έλ“œ λ°©λ¬Έ
  3. 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ 탐색

πŸ”Ή 예제 트리

μ•„λž˜μ™€ 같은 BSTκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

        4
       / \
      2   6
     / \   \
    1   3   7

μ€‘μœ„ 순회(In-order Traversal) μ‹€ν–‰ κ²°κ³Ό:

1 → 2 → 3 → 4 → 6 → 7  (μ˜€λ¦„μ°¨μˆœ)

즉, BSTλŠ” In-order Traversal을 ν•˜λ©΄ μ •λ ¬λœ μƒνƒœλ‘œ 값이 λ‚˜μ˜€λ―€λ‘œ, 이전 κ°’κ³Ό ν˜„μž¬ 값을 λΉ„κ΅ν•˜λ©΄μ„œ μ΅œλΉˆκ°’μ„ 찾을 수 있음!


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        
        self.current_val = None
        self.current_count = 0
        self.max_count = 0
        self.modes = []

        def inorder_traversal(node):
            if node is None:
                return
            
            # 1. μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬ 탐색
            inorder_traversal(node.left)
            
            # 2.1. ν˜„μž¬ λ…Έλ“œ λ°©λ¬Έ
            if node.val == self.current_val:
                self.current_count += 1
            else:
                self.current_val = node.val
                self.current_count = 1
            
            # 2.2. mode(s) κ°±μ‹ 
            if self.current_count > self.max_count:
                self.max_count = self.current_count
                self.modes = [node.val]
            elif self.current_count == self.max_count:
                self.modes.append(node.val)
            
            # 3. 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ 탐색
            inorder_traversal(node.right)
        
        # 4. μ€‘μœ„ 순회 μ‹œμž‘
        inorder_traversal(root)
        return self.modes