Skip to content

Latest commit

 

History

History
139 lines (114 loc) · 2.96 KB

098. Validate Binary Search Tree.md

File metadata and controls

139 lines (114 loc) · 2.96 KB
Difficulty Related Topics Similar Questions
Medium

Problem:

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Example 1:

Input:
    2
   / \
  1   3
Output: true

Example 2:

Input:
    5
   / \
  1   4
     / \
    3   6
Output: false

Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value
             is 5 but its right child's value is 4.

Solution:

ONE

Maintain the max and min value base on parent value. Any traversal algorithm is alright.

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root, min = -Infinity, max = Infinity) {
  if (!root) { return true }
  if (root.val <= min || root.val >= max) { return false }
  return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max)
};

TWO

The result of a BST in-order traversal is a sorted list. So just need to compare with the last node.

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root, lastNode = new TreeNode()) {
  if (!root) { return true }
  if (!isValidBST(root.left, lastNode)) { return false }
  if (lastNode.val != null && lastNode.val >= root.val) { return false }
  lastNode.val = root.val
  return isValidBST(root.right, lastNode)
};

THREE

Imperative version of Solution TWO.

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
  let lastVal = -Infinity
  const stack = []
  let node = root

  while (node || stack.length > 0) {
    if (node) {
      stack.push(node)
      node = node.left
    } else {
      node = stack.pop()
      if (lastVal >= node.val) {
        return false
      }
      lastVal = node.val
      node = node.right
    }
  }

  return true
};

Template generated via Leetmark.