Medium
Given the root of a binary tree, determine if it is a valid binary search tree (BST).
A valid BST is defined as follows:
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:
[1, 104].-231 <= Node.val <= 231 - 1; Definition for a binary tree node.
#|
; val : integer?
; left : (or/c tree-node? #f)
; right : (or/c tree-node? #f)
(struct tree-node
  (val left right) #:mutable #:transparent)
; constructor
(define (make-tree-node [val 0])
  (tree-node val #f #f))
|#
(define/contract (is-valid-bst-recur root low high)
    (-> (or/c tree-node? #f) exact-integer? exact-integer? boolean?)
  (if (tree-node? root)
      (let ([v (tree-node-val root)])
      (and (< low v) (> high v) (is-valid-bst-recur (tree-node-left root) low v) (is-valid-bst-recur (tree-node-right root) v high)))
      true))
(define/contract (is-valid-bst root)
  (-> (or/c tree-node? #f) boolean?)
  (is-valid-bst-recur root (- (-(expt 2 31)) 5) (expt 2 31)))