算法小知识-----8.03-----验证二叉搜索树

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

这是我出差的第一题,也是卡住不太会的一题

验证二叉搜索树

该题出自力扣的98题—— 验证二叉搜索树【中等题】,二叉树的递归理念,一直都没有十分牢固

审题

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
  • 题意并不困难,就是会比较繁琐,因为需要知道搜索二叉树的含义
    • 所谓搜索二叉树 —— 左节点比根节点小,右节点比根节点大
  • 那么显而易见的就可以萌生出一种解决方案:利用递归的方式实现
    • 这个方法有一个细节需要注意:不只是比当前子树的根节点比较,还需要与父级甚至最顶层的根节点比较
    • 因此,需要衍生出一个方法去调用:
      • 左节点的最小值是最小值,最大值就是根节点
      • 右节点的最小值就是根节点,最大值就是最大值
  • 除却这种方式,还有一种方式就是 利用中序遍历 —— 那就直接就是升序的;中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。
  • 第一眼的想法也是中序遍历。二叉搜索树中序遍历得到升序,对给定的二叉树中序遍历,结果记录于res之中,检验res是否为严格的升序,若是则为true,反之false。不过没想到竟然还能这么简洁

编码

class Solution {
    public boolean isValidBST(TreeNode root) {
        return validate(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    public boolean validate(TreeNode node, long min, long max) {
        if (node == null) {
            return true;
        }
        if (node.val <= min || node.val >= max) {
            return false;
        }
        return  validate(node.left, min, node.val) && validate(node.right, node.val, max);
    }
}

复制代码
class Solution {
    double last = -Double.MAX_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        if (isValidBST(root.left)) {
            if (last < root.val) {
                last = root.val;
                return isValidBST(root.right);
            }
        }
        return false;
    }
}
复制代码

image.png

猜你喜欢

转载自juejin.im/post/7127676108199657479