试题
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的。
/**
* 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;
}
}