试题
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:
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.
代码:
对二叉搜索树验证,我们不仅要验证左子节点<父节点<右子节点,其实父节点的父节点还为右边提供了一个下界,为左边提供了一个上界。如图中4位置要求是大于5的。
我们要在当前节点把它的left节点和right节点的上届和下届都要提前比较好。不然到下个节点就无法分清到底是来自于左节点还是右节点。主要比较一下内容:
当前节点大于左节点、小于右节点;
左节点大于下届,右节点小于上届。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return valided(root, null, null);
}
public boolean valided(TreeNode root, Integer low, Integer high){
if(root == null) return true;
if(root.left != null){
if(root.left.val >= root.val || (low != null && root.left.val <= low) )
return false;
}
if(root.right != null){
if(root.right.val <= root.val || (high != null && root.right.val >= high) )
return false;
}
return valided(root.left, low, root.val) && valided(root.right, root.val, high);
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
if(root==null) return true;
Stack<TreeNode> sta = new Stack<>();
Stack<Integer> up = new Stack<>();
Stack<Integer> low = new Stack<>();
sta.push(root);
up.push(null);
low.push(null);
while(!sta.isEmpty()){
TreeNode cur = sta.pop();
Integer lower = low.pop();
Integer upper = up.pop();
if(cur.left!=null){
if(cur.left.val>=cur.val) return false;
if(lower!=null && cur.left.val<=lower) return false;
sta.push(cur.left);
low.push(lower);
up.push(cur.val);
}
if(cur.right!=null){
if(cur.right.val<=cur.val) return false;
if(upper!=null && cur.right.val>=upper) return false;
sta.push(cur.right);
low.push(cur.val);
up.push(upper);
}
}
return true;
}
}