LintCode : Validate Binary Search Tree
Description:
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.
- A single node tree is a BST
Example:
An example:
2
/ \
1 4
/ \
3 5
The above binary tree is serialized as {2,1,4,#,#,3,5}
(in level order).
/** * 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) { if (root.left != null) { if (root.val <= root.left.val) { return false; } } if (root.right != null) { if (root.val >= root.right.val) { return false; } } return validBSTHelper(root.left, root.val, false) & validBSTHelper(root.right, root.val, true); } return true; } public boolean validBSTHelper(TreeNode root, int lastVal, boolean k) { if (root != null) { if (root.left != null) { if (root.val <= root.left.val || (root.left.val <= lastVal) == k) { return false; } } if (root.right != null) { if (root.val >= root.right.val || (root.right.val <= lastVal) == k) { return false; } } return validBSTHelper(root.left, root.val, false) & validBSTHelper(root.right, root.val, true); } return true; } }
The most important thing here is to remember that for one node, all the values in the left are less, all the values in the right are bigger.