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)))