判断给出的二叉树是否是一个二叉搜索树(BST)
二叉搜索树的定义如下
一个节点的左子树上节点的值都小于自身的节点值
一个节点的右子树上节点的值都小于自身的节点值
所有节点的左右子树都必须是二叉搜索树
递归
解题思路:
1.find(root, low, up) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r) 的范围内说明不满足条件,return false.
2.递归调用左子树时,我们需要把 up 改为 root.val
3.递归调用右子树时,我们需要把low 改为 root.val
O(n),T(n)
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isValidBST (TreeNode root) {
return find(root,null,null);
}
public boolean find(TreeNode root,Integer low,Integer up){
if(root==null){
return true;
}
if(low!=null&&root.val<=low) return false;
if(up!=null&&root.val>=up) return false;
if(!find(root.right,root.val,up)) return false;
if(!find(root.left,low,root.val)) return false;
return true;
}
}
中序遍历
INT_MIN是先转换成long long类型然后再减去1的,也就是比所有的测试用例的值都要小了(测试用例的最小值是INT_MIN)
解题思路:
1.中序遍历:升序,借助栈
2.判空
3.找到中序遍历第一个节点(最左下),并且入栈
3.弹栈节点值>前面节点pre值,否则不是BST,更新pre值
4.遍历右子树
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
double pre = -Double.MAX_VALUE;//pre记录访问节点前一个值,初始化为最小
if (root == null) {
return true;
}
while (root != null || !stack.isEmpty()) {
//找到中序遍历的第一个节点(最左下)
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
if (root.val <= pre) return false;
pre = root.val;
root = root.right;
}
return true;
}
}