描述
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子树上的所有节点均严格小于当前节点且右子树上的所有节点均严格大于当前节点。
例:
图1
图2
数据范围:节点数量满足 1≤n≤104 1 \le n\le 10^4 \ 1≤n≤104 ,节点上的值满足 −231≤val≤231−1 -2^{31} \le val \le 2^{31}-1\ −231≤val≤231−1
示例1
输入:{1,2,3}
返回值:false
说明:如题面图1
示例2
输入:{2,1,3}
返回值:true
说明:
如题面图2
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
//0.定义当前结点为整数最小值
int pre =Integer.MIN_VALUE;
//中序遍历
public boolean isValidBST (TreeNode root) {
// write code here
//1.如果根为空返回true
if(root == null)
return true;
//2.先进入左子树,如果左子树不是二叉搜索树,返回false
if(!isValidBST(root.left))
return false;
//3.每个节点的左子树上的所有节点均严格小于当前节点
//且右子树上的所有节点均严格大于当前节点。
if(root.val<pre)
return false;
//4.更新最值
pre=root.val;
//5.在进入右子树
return isValidBST(root.right);
}
}
具体做法:
step 1:首先递归到最左,初始化maxLeft与pre。
step 2:然后往后遍历整棵树,依次连接pre与当前节点,并更新pre。
step 3:左子树如果不是二叉搜索树返回false。
step 4:判断当前节点是不是小于前置节点,更新前置节点。
step 5:最后由右子树的后面节点决定。