문제 설명
Given therootof a binary tree,determine if it is a valid binary search tree (BST).
A valid BST is defined as follows:
- The left subtree of a node contains only nodes with keysless thanthe node's key.
- The right subtree of a node contains only nodes with keysgreater thanthe node's key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
Input: root = [2,1,3] Output: true
Example 2:
Input: root = [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4.
Constraints:
- The number of nodes in the tree is in the range[1, 104].
- -231<= Node.val <= 231- 1
풀이 과정
- 처음엔 부모 노드 기준으로 왼쪽, 오른쪽 노드의 값을 검사하는 방식으로만 진행
- 트리의 깊이가 깊어지면 틀림.
- 루트 노드 기준으로 .. 왼쪽 서브 트리의 모든 값은 루트 노드보다 작아야 되고, 오른쪽 서브 트리의 모든 값은 루트 노드보다 커야 함.
- 따라서, 범위를 기준으로 Validate 진행
- 초기 범위를 -2의 32승 ~ 2의 32승으로 두고
- 현재 노드의 값이 범위 내에 들어있는지 검사(들어있지 않다면 False)
- 현재 노드의 값이 범위 내에 들어있으면 자식 노드들 방문
- 방문할 때, 범위 조절해주어야 함. 현재 범위가 (a ~ b)라면
- 왼쪽 방문할 때는 (a ~ 현재 노드의 값)
- 오른쪽 방문할 때는 (현재 노드의 값 ~ b)
- 모든 노드들에 대해 조건 만족하는 경우 이진 트리이므로 True, 아니면 False 리턴
소스 코드
# 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:
flag = False
def validate(root, fr, to):
if root == None:
return True
if fr < root.val and root.val < to:
return validate(root.left, fr, root.val) and validate(root.right, root.val, to)
else:
return False
return validate(root, -2**32, 2**32)
'알고리즘[Python] > LeetCode' 카테고리의 다른 글
[ 구현 ] Longest Palindromic Substring (0) | 2021.12.25 |
---|---|
[4] [ queue ] Median of Two Sorted Arrays (0) | 2021.08.28 |
[2] [Linked List] Add Two Numbers (0) | 2021.08.28 |
[ 23 ] [ heap ] Merge k Sorted Lists (0) | 2021.08.20 |
[ 3 ] [ Queue, set ] Longest Substring Without Repeating Characters (0) | 2021.08.15 |