leetcode98 验证二叉树

99 阅读2分钟

又是刷题leetcode acv的一天,看着总是感觉很简单,但是写起来总是各种细节问题,再加上脖子不舒服,太丧了。。。。。。

该题目有两种解法:

  1. 使用递归,根据搜索二叉树的特性,每一次递归都需要确定该递归区间的最大值、最小值。如果是左节点那么就需要确定最大值就能确定最大值范围为该结点的val,如果是右节点的话,那么就可以确定最小值为该结点的val。这个代码就不粘贴了,只是需要注意极端情况根节点为Integer.MAV_VAL的情况下,会出错,解决方法:leetcode官方使用long类型的参数解决的。
  2. 根据bst的特性,就可以使用中序遍历,使用一个集合存储所有的节点或者一个变量进行存储上一个节点,都是可以的,集合的话,就可以直接进行遍历是否有序就可以了,如果是一个变量的话,就在中序遍历时,进行比较即可。
public class leetcode98B {
    /**
     * 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
     * @param root
     * @return
     */
//    一定要要使用long类型,避免极端情况。
    private long lastVal = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        if (!isValidBST(root.left)) return false;
        if (lastVal > root.val) return false;
        lastVal = root.val;
        return isValidBST(root.right);
    }
}
  1. 注意:我使用了一个long = Integer.MIN_VAL-1;是不可以这样使用的它会得到另外一个值,2147483647。
  • 在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。
    对整形最大值加1,2147483648(越界了),那么此时值为多少呢?结果是-2147483648,即是Integer.MIN_VALUE。
    类似的,对Integer.MIN_VALUE取反或者取绝对值呢?仍为Integer.MIN_VALUE,因为值为-2147483648,绝对值2147483648超过Integer.MAX_VALUE 2147483647。
    所以就有以下结果
    Integer.MAX_VALUE + 1 = Integer.MIN_VALUE
    Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE (绝对值)
    Long,short,byte的结论是相同的。算是吸取教训了。