package com.fishercoder.solutions;

import com.fishercoder.common.classes.TreeNode;

/**
 * 98. Validate Binary Search Tree
 *
 * 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:
   2
  / \
 1   3
 Binary tree [2,1,3], return true.

 Example 2:
   1
  / \
 2   3
 Binary tree [1,2,3], return false.
 */
public class _98 {

    public static class Solution1 {

        public boolean isValidBST(TreeNode root) {
            return valid(root, null, null);
        }

        boolean valid(TreeNode root, Integer min, Integer max) {
            if (root == null) {
                return true;
            }
            if ((min != null && root.val <= min) || (max != null && root.val >= max)) {
                return false;
            }
            return valid(root.left, min, root.val) && valid(root.right, root.val, max);
        }
    }


    public static class Solution2 {
        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            return dfs(root.left, Long.MIN_VALUE, root.val) && dfs(root.right, root.val, Long.MAX_VALUE);
        }

        private boolean dfs(TreeNode root, long minValue, long maxValue) {
            if (root == null) {
                return true;
            }
            if (root != null && (root.val <= minValue || root.val >= maxValue)) {
                return false;
            }
            boolean leftResult = true;
            boolean rightResult = true;
            if (root.left != null) {
                leftResult = dfs(root.left, minValue, root.val);
            }
            if (root.right != null) {
                rightResult = dfs(root.right, root.val, maxValue);
            }
            return leftResult && rightResult;
        }
    }

}

@@ -1157,939 +1157,6 @@
  %7D%0A%0A
-%0A    public static class Solution2 %7B%0A        public boolean isValidBST(TreeNode root) %7B%0A            if (root == null) %7B%0A                return true;%0A            %7D%0A            return dfs(root.left, Long.MIN_VALUE, root.val) && dfs(root.right, root.val, Long.MAX_VALUE);%0A        %7D%0A%0A        private boolean dfs(TreeNode root, long minValue, long maxValue) %7B%0A            if (root == null) %7B%0A                return true;%0A            %7D%0A            if (root != null && (root.val %3C= minValue %7C%7C root.val %3E= maxValue)) %7B%0A                return false;%0A            %7D%0A            boolean leftResult = true;%0A            boolean rightResult = true;%0A            if (root.left != null) %7B%0A                leftResult = dfs(root.left, minValue, root.val);%0A            %7D%0A            if (root.right != null) %7B%0A                rightResult = dfs(root.right, root.val, maxValue);%0A            %7D%0A            return leftResult && rightResult;%0A        %7D%0A    %7D%0A%0A
 %7D%0A

refactor 98