|
| 1 | +# Definition for a binary tree node. |
| 2 | +# class TreeNode: |
| 3 | +# def __init__(self, val=0, left=None, right=None): |
| 4 | +# self.val = val |
| 5 | +# self.left = left |
| 6 | +# self.right = right |
| 7 | +class Solution: |
| 8 | + def isValidBST(self, root: Optional[TreeNode]) -> bool: |
| 9 | + def validate(node, min_val, max_val): |
| 10 | + if not node: |
| 11 | + return True |
| 12 | + |
| 13 | + if node.val <= min_val or node.val >= max_val: |
| 14 | + return False |
| 15 | + |
| 16 | + return (validate(node.left, min_val, node.val) and |
| 17 | + validate(node.right, node.val, max_val)) |
| 18 | + |
| 19 | + return validate(root, float('-inf'), float('inf')) |
| 20 | + |
| 21 | + |
| 22 | +""" |
| 23 | +================================================================================ |
| 24 | +풀이 과정 |
| 25 | +================================================================================ |
| 26 | +
|
| 27 | +[1차 시도] 단순 재귀 |
| 28 | +──────────────────────────────────────────────────────────────────────────────── |
| 29 | +4. left < node < right 체크를 해줘야하고 |
| 30 | +5. 각 노드는 자신의 서브트리에서 최소값과 최대값을 가지고 있어야함 |
| 31 | +6. 현재 노드보다 왼쪽은 작은 값, 오른쪽은 큰 값 |
| 32 | +7. 재귀적으로 구현할 수 있음 |
| 33 | +
|
| 34 | + def validate(node, min_val, max_val): |
| 35 | + if not node: |
| 36 | + return True |
| 37 | +
|
| 38 | + if node.val <= min_val or node.val >= max_val: |
| 39 | + return False |
| 40 | +
|
| 41 | + # 재귀적으로 왼쪽, 오른쪽 서브트리 체크 |
| 42 | + # 왼쪽 서브트리는 현재 노드 값보다 작아야하고, 오른쪽 서브트리는 현재 노드 값보다 커야함 |
| 43 | + return (validate(node.left, min_val, node.val) and |
| 44 | + validate(node.right, node.val, max_val)) |
| 45 | +
|
| 46 | + return validate(root, float('-inf'), float('inf')) |
| 47 | +
|
| 48 | +8. 시간 복잡도: O(n) - 모든 노드를 한 번씩 방문 |
| 49 | +9. 공간 복잡도: O(h) - 재귀 호출 스택 (h는 트리 높이) |
| 50 | +10. 재귀적으로 스택 오버플로우가 발생하는 것이 우려되면 iterative로 구현할 수 있음 |
| 51 | +""" |
0 commit comments