LeetCode in Racket

98. Validate Binary Search Tree

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:

Solution

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