# 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: TreeNode) -> bool:
from dataclasses import dataclass
@dataclass
class Info:
mx: int
mi: int
is_bst: bool
def dfs(x):
if not x: return Info(float('-inf'), float('inf'), True)
l, r = dfs(x.left), dfs(x.right)
mx = max(x.val, r.mx)
mi = min(x.val, l.mi)
is_bst = l.is_bst and r.is_bst and l.mx < x.val < r.mi
return Info(mx, mi, is_bst)
return dfs(root).is_bst