Validate Binary Search Tree
22% Accepted
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.
Have you met this question in a real interview? Yes
Example
An example:
  2
 / \
1   3
   /
  4
   \
    5
The above binary tree is serialized as {2,1,3,#,#,4,#,#,5} (in level order).
Tags Expand
- Divide and Conquer
- Recursion
- Binary Search Tree
- Binary Tree
思路
- 非递归思路无非就是一个中序遍历,如果不满足前值小于后值,则不是BST
- 递归思路:新建一个函数,把当前结点所能拥有的最大值与最小值传入,如果此节点超过最大值或者小于最小值,说明不符合要求
- 因为test case含有Integer.MAX_VALUE 和 Integer.MIN_VALUE, 所以判断的时候用的Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY
非递归
/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    public boolean isValidBST(TreeNode root) {
        // write your code here
        if (root == null) {
            return true;
        }
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
        double pre = Double.NEGATIVE_INFINITY;
        while (!stack.isEmpty() || cur != null) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            if (cur.val <= pre) {
                return false;
            }
            pre = cur.val;
            cur = cur.right;
        }
        return true;
    }
}
递归
- 在函数里添加min, max或者做一个新的result type都可以
- 把父节点的值向下传,每次在递归的时候,就要保证在左子树的时候,此时的root的值不能比max大,右子树时,不能比min小
- 在上层已经限定好了值
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
    }
    public boolean isValidBST(TreeNode root, double min, double max){
        if (root == null) {
            return true;
        }
        if (root.val <= min || root.val >= max) {
            return false;
         }
        boolean left = isValidBST(root.left, min, root.val);
        boolean right = isValidBST(root.right, root.val, max);
        return left && right;
    }
}