这里限制左右边界,不是简单的Integer.MaxValue,而是Long.MaxValue。当然也可以用中序排序,两个都可以。哈哈,还有逻辑符号,我也不经常使用。
题目如下:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: 2 / \ 1 3 输出: true
我的解决办法:快一点的
package test;
public class LC98Try2
{
public boolean isValidBST(TreeNode root)
{
if(root==null){
return true;
}
boolean ret=true;
//当输入为[Integer.MAX_VALUE] 不可用
//ret=getpass(root,Integer.MIN_VALUE,Integer.MAX_VALUE);
ret=getpass(root,Long.MIN_VALUE,Long.MAX_VALUE);
return ret;
}
public boolean getpass(TreeNode root,long lm,long rm){
boolean ret=true;
if(root.val>=rm || root.val<=lm){
return false;
}
if(root.left!=null){
ret=getpass(root.left,lm,root.val);
}
if(!ret){
return ret;
}
if(root.right!=null){
ret=getpass(root.right,root.val,rm);
}
return ret;
}
}
中序遍历:
package test;
import java.util.ArrayList;
import java.util.List;
public class LC98Try1
{
public boolean isValidBST(TreeNode root)
{
boolean ret = false;
if(root==null){
return true;
}
List<Integer> list = new ArrayList<Integer>();
ret=dp2(root,list);
return ret;
}
//中序遍历
public boolean dp2(TreeNode root,List<Integer> list){
boolean ret=false;
if(root.left!=null){
TreeNode node=root.left;
ret=dp2(node,list);
if(!ret){
return false;
}
}
if(list.size()>0){
int pre=list.get(list.size()-1);
if(root.val<=pre){
return false;
}
}
list.add(root.val);
if(root.right!=null){
TreeNode node=root.right;
ret=dp2(node,list);
if(!ret){
return false;
}
}
return true;
}
public static void main(String[] args)
{
LC98Try1 t= new LC98Try1();
TreeNode root= new TreeNode(4);
TreeNode l=new TreeNode(1);
TreeNode r=new TreeNode(3);
root.left=l;
root.right=r;
System.out.println(t.isValidBST(root));
}
}
用上逻辑符号:别人就可以想的到,说明自己做题还是太少。
class Solution {
public boolean isValidBST(TreeNode root) {
return helper(root, Long.MAX_VALUE, -Long.MAX_VALUE);
}
public boolean helper(TreeNode node, long max, long min) {
if (node == null) return true;
if (node.val >= max || node.val <= min) return false;
return helper(node.left, Math.min(max, node.val), min) &&
helper(node.right, max, Math.max(min, node.val));
}
}
哈哈