98. 验证二叉搜索树

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

98. 验证二叉搜索树_第1张图片

解题思路:

二叉搜索树的定义:

二叉搜索树或者是一颗空树,或者是具有如下性质的二叉树:

  1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值
  2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
  3. 它的左、右子树也分别为二叉搜索树。

方法一:中序遍历

 二叉搜索树中序遍历得到的结果一定是升序的,所以可以先得到树中所有节点中序遍历的值,然后在判断中序遍历得到的集合是否是升序的,如果是,返回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 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);
    }
}

98. 验证二叉搜索树_第2张图片

方法二: 递归

二叉搜索树的定义是递归的,可以递归的判断左右子树是否是二叉搜索树。

根节点的值确定后,左子树中所有节点的值都要小于根节点,右子树中所有节点的值都要大于根节点,所以可以使用 min 和 max 两个变量标记当前二叉搜索树中所有节点值的范围。具体算法如下:

  1. 定义递归函数:isValidBST(TreeNode root, long min, long max),判断当前二叉树是否是二叉搜索树,并且需要满足所有节点值的范围在 (min,max)区间内。
  2. 递归终止条件:如果 root==null,返回true
  3. 否则:
    1. 如果root节点的值不在区间 (min,max) 内,说明不是一个二叉搜索树,返回false
    2. 递归的判断左子树的是否是二叉搜索树:isValidBST(root.left, min, root.val),此时左子树节点所有节点值都要小于根节点,即最大值不能大于 root.val,更新 max=root.val
    3. 递归的判断右子树的是否是二叉搜索树:isValidBST(root.left, root.val, max),此时右子树节点所有节点值都要大于根节点,即最小于值不能小于 root.val,更新 min=root.val
    4. return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
  4. 注意:因为节点值得大小范围为 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);
    }
}

98. 验证二叉搜索树_第3张图片

你可能感兴趣的:(LeetCode_Java版,递归,leetcode,算法,力扣,数据结构,java)