https://leetcode.com/problems/validate-binary-search-tree/description/
해당 문제는 이진 탐색 트리의 조건에 해당하는 트리인지 아닌지를 리턴하는 문제이다. left 노드의 값이 해당 노드보다 더 작아야하고, right 노드의 값이 더 커야 한다.
첫 시도에서는, root를 재귀적으로 호출하여 왼쪽 노드와의 값을 비교하고 왼쪽으로 타고 내려가며 확인하는 방법으로 풀고자하였다. root가 None이 될 때, 즉 왼쪽 leaf 노드로 갈 경우 오른쪽 노드로 옮겨가 확인하지 않고 리턴해 버리는 문제가 있었다.
# 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 isValidBST(self, root: Optional[TreeNode]) -> bool:
def check(root):
if root is None:
return
print(root.val)
if root.left is not None and root.left.val>root.val:
return False
elif root.left is None:
return
else:
root=root.left
check(root)
if root.right is not None and root.right.val<root.val:
return False
elif root.right is None:
return
else:
root=root.right
check(root)
check(root)
return True
최종 답안은 다음과 같다. 재귀 함수의 리턴값으로 왼쪽 노드를 호출하는 부문과 오른쪽 노드를 호출하는 부문을 나누어 처리한다. 이를 통해 두 방향 모두 조건을 만족해야 통과할 수 있게끔 구성할 수 있다.
왼편을 처리할 때는 현재 노드의 값을 max로 하여, 현재 노드 값보다 더 커진다면 False가 되게끔 한다.
오른편을 처리할 때도 마찬가지로 현재 노드의 값을 min으로 하여, 현재 노드 값보다 작아진다면 False가 되게끔 한다.
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def check(root, min_val, max_val):
if root is None:
return True
if root.val <= min_val or root.val >= max_val:
return False
return (check(root.left, min_val, root.val) and
check(root.right, root.val, max_val))
return check(root, float('-inf'), float('inf'))
[코테] 리트코드 파이썬 131번 Palindrome Partitioning 회문 (0) | 2024.03.23 |
---|---|
[코테] 리트코드 파이썬 128번 Longest Consecutive Sequence (0) | 2024.03.18 |
[코테] 리트코드 파이썬 62번, 64번, 79번 2차원 리스트 최단거리 관련 (0) | 2024.02.25 |
[코테] 리트코드 파이썬 - 54번, 55번, 56번 (0) | 2024.02.16 |
[코테] 리트코드 파이썬 49번, 46번, 48번 - permutations 등 (0) | 2024.02.12 |