1 题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 解题思路
-
方法一:中序遍历+排序
第一眼的想法也是中序遍历。
二叉搜索树中序遍历得到升序,对给定的二叉树中序遍历,结果记录于res之中,
**检验res是否为严格的升序,**若是则为true,反之false。 -
方法二:递归+中序遍历+排序
中序遍历时,判断当前节点是否大于中序遍历的前一个节点,
如果大于,说明满足 BST,继续遍历;否则直接返回 false。
3 解决代码
- 方法一:中序遍历+排序《Java代码》
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> res = new ArrayList<>();
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
inOrder(root);
//判断是不是一个严格升序序列
for(int i = 1; i < res.size(); i++){
if(res.get(i) <= res.get(i - 1)){
return false;
}
}
return true;
}
//进行中序遍历-递归法
public void inOrder(TreeNode root){
if(root != null){
inOrder(root.left);
res.add(root.val);
inOrder(root.right);
}
}
}
- 方法二:递归+中序遍历+排序《Java代码》
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
// 访问左子树
if(!isValidBST(root.left)){
return false;
}
// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
if(root.val <= pre){
return false;
}
pre = root.val;
// 访问右子树
return isValidBST(root.right);
}
}