题目描述
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.
confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
思路1、对其可以用中序遍历来判断是否为BST,中序遍历需要借助栈来实现,对于空的处理,也是返回True(非递归)
思路2、标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。(递归实现)
注意:
我们可以不用每次都去查找最大值和最小值,每次向下递归时,我们只要把该节点的值, 作为一个最大值, 传给它的左节点,也就是左边所有节点的值都要比它小;并且把它的值,作为最小值,传给它的右节点,也就是右边所有节点的值都要比它大。每次向下走,分别更新最大值和最小值即可。
import java.util.Stack; //方法一
public class ValidBST {
public static boolean isValidBST(TreeNode root){
if(root==null) return true;
Stack<TreeNode> st=new Stack<TreeNode>();
TreeNode pre=null;
TreeNode cur=root;
while(!st.isEmpty() ||cur != null) {
if(cur==null) {
cur=st.pop();
if (pre != null && pre.val >= cur.val)//判断左结点和根结点的关系
return false;
pre = cur;//现在结点成为前面的结点
cur = cur.right;//遍历其右面的结点
}
else {
st.push(cur);//接着入栈
cur = cur.left;//左结点进栈
}
}
return true;
}
public static void main(String[] args) {
TreeNode root=new TreeNode(6);
TreeNode node1=new TreeNode(1);
TreeNode node2=new TreeNode(8);
root.left=node1;
root.right=node2;
ValidBST rl=new ValidBST();
System.out.println(rl.isValidBST(root));
}
}
//方法二
public class ValidBST {
public static boolean isBSTHelper(TreeNode p, int low, int high) { if (p == null) return true; if (low < p.val && p.val < high) return isBSTHelper(p.left, low, p.val) && isBSTHelper(p.right, p.val, high); else return false; } public static final int INT_MIN = 0x80000000;public static final int INT_MAX= 0x7fffffff;//定义一下public static boolean isBST(TreeNode root) { return isBSTHelper(root, INT_MIN, INT_MAX); } public static void main(String[] args) {TreeNode root=new TreeNode(6);TreeNode node1=new TreeNode(1);TreeNode node2=new TreeNode(8);root.left=node1;root.right=node2;ValidBST rl=new ValidBST();System.out.println(rl.isBST(root)); } }