题意整理

  • 给定一颗二叉树。
  • 判断该树是否是二叉搜索树。

方法一(递归)

1.思路整理

判断搜索二叉树(BST): 考虑搜索二叉树的定义,每一个节点的值应该大于等于左子树中的最大值,小于等于右子树中的最小值。所以我们可以利用递归遍历每一个节点,如果某个节点不满足定义,则不合法,直接返回false。

图解展示:

alt

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布尔型
     */
    public boolean isValidBST (TreeNode root) {
        
        return BST(root,Integer.MIN_VALUE,Integer.MAX_VALUE);
    }
    
    //left为当前左子树最大值,right为当前右子树最小值
    private boolean BST(TreeNode root,long left,long right){
        //递归终止条件
        if(root==null) return true;
        //如果当前节点小于等于左子树节点最大值或者大于等于右子树节点最小值,则不合法
        if(root.val<=left||root.val>=right){
            return false;
        }
        //往左子树递归时,left不变,对应右子树由于要考虑当前节点,right变为root.val,同理考虑右子树
        return BST(root.left,left,root.val)&&BST(root.right,root.val,right);
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历树中所有节点,所以时间复杂度为O(n)O(n)
  • 空间复杂度:递归栈的深度为log2nlog_2n,最坏情况下,递归栈深度为n,所以空间复杂度是O(n)O(n)

方法二(利用中序遍历)

1.思路整理

判断搜索二叉树(BST): 如果中序遍历搜索二叉树,则过程中的节点一定是从小到大排列的,利用这个特点,检查遍历过程中的每一个节点,如果不满足,则不合法。

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布尔型
     */
    //中序遍历中当前节点的前一个节点对应的值
    int pre=Integer.MIN_VALUE;
    
    public boolean isValidBST (TreeNode root) {
        
        return BST(root);
    }
    
    private boolean BST(TreeNode root){
        //递归终止条件
        if(root==null) return true;
        //判断左子树
        if(!BST(root.left)) return false;
        //如果当前节点值小于等于前一个,说明不是搜索二叉树
        if(root.val<=pre) return false;
        pre=root.val;
        //判断右子树
        return BST(root.right);
    }
}

3.复杂度分析

  • 时间复杂度:需要遍历树中所有节点,所以时间复杂度为O(n)O(n)
  • 空间复杂度:递归栈的深度为log2nlog_2n,最坏情况下,递归栈深度为n,所以空间复杂度是O(n)O(n)