题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路:
二叉搜索树的定义:
二叉搜索树或者是一颗空树,或者是具有如下性质的二叉树:
- 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值
- 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
- 它的左、右子树也分别为二叉搜索树。
方法一:中序遍历
二叉搜索树中序遍历得到的结果一定是升序的,所以可以先得到树中所有节点中序遍历的值,然后在判断中序遍历得到的集合是否是升序的,如果是,返回true,否则返回false
AC代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> list=new ArrayList<>();
public boolean isValidBST(TreeNode root) {
if (root==null){
return true;
}
inOrderTraversal(root);
int pre = list.get(0);
for (int i = 1; i < list.size(); i++) {
int cur = list.get(i);
if (cur<=pre){
return false;
}
pre=cur;
}
return true;
}
public void inOrderTraversal(TreeNode root){
if (root==null){
return;
}
inOrderTraversal(root.left);
list.add(root.val);
inOrderTraversal(root.right);
}
}
方法二: 递归
二叉搜索树的定义是递归的,可以递归的判断左右子树是否是二叉搜索树。
根节点的值确定后,左子树中所有节点的值都要小于根节点,右子树中所有节点的值都要大于根节点,所以可以使用 min 和 max 两个变量标记当前二叉搜索树中所有节点值的范围。具体算法如下:
- 定义递归函数:isValidBST(TreeNode root, long min, long max),判断当前二叉树是否是二叉搜索树,并且需要满足所有节点值的范围在 (min,max)区间内。
- 递归终止条件:如果 root==null,返回true
- 否则:
- 如果root节点的值不在区间 (min,max) 内,说明不是一个二叉搜索树,返回false
- 递归的判断左子树的是否是二叉搜索树:isValidBST(root.left, min, root.val),此时左子树节点所有节点值都要小于根节点,即最大值不能大于 root.val,更新 max=root.val
- 递归的判断右子树的是否是二叉搜索树:isValidBST(root.left, root.val, max),此时右子树节点所有节点值都要大于根节点,即最小于值不能小于 root.val,更新 min=root.val
- return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
- 注意:因为节点值得大小范围为 int 类型得最小值 至 最大值之间,所以初始值,min= Long.MIN_VALE,max=Long.MAX_VALUE;
AC代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long min, long max) {
if (root == null) {
return true;
}
if (min >= root.val || max <= root.val) {
return false;
}
return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
}
}