zoukankan      html  css  js  c++  java
  • Leetcode NO.98 Validate Binary Search Tree 验证二叉搜索树

    1.问题描述

    你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

    有效 二叉搜索树定义如下:

    • 节点的左子树只包含 小于 当前节点的数。
    • 节点的右子树只包含 大于 当前节点的数。
    • 所有左子树和右子树自身必须也是二叉搜索树。

    2.测试用例

    示例 1
    输入:root = [2,1,3]
    输出:true
    
    示例2
    输入:root = [5,1,4,null,null,3,6]
    输出:false
    解释:根节点的值是 5 ,但是右子节点的值是 4 。
    

    3.提示

    • 树中节点数目范围在[1, 104] 内
    • -231 <= Node.val <= 231 - 1

    4.代码

    节点信息
    public class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;
    
    
        public TreeNode(int val) {
            this.val = val;
        }
    
        public TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    
    1.基于前序遍历思路
    code
    public boolean isValidBSTWithPre(TreeNode root) {
        if (root == null) {
            return true;
        }
        return isValidBst(root, null, null);
    }
    
    private boolean isValidBst(TreeNode root, Integer lower, Integer upper) {
        if (root == null) {
            return true;
        }
        if (lower != null && root.val <= lower) {
            return false;
        }
        if (upper != null && root.val >= upper) {
            return false;
        }
        return isValidBst(root.left, lower, root.val) && isValidBst(root.right, root.val, upper);
    }
    
    复杂度
    * 时间复杂度:O(n)
    * 空间复杂度:O(logn)
    
    2.基于中序遍历思路
    code
    ArrayList<Integer> res = new ArrayList<Integer>();
    
    public boolean isValidBSTWithIn(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;
    }
    
    private void inOrder(TreeNode node) {
        if (node == null) {
            return;
        }
        inOrder(node.left);
        res.add(node.val);
        inOrder(node.right);
    }
    
    复杂度
    * 时间复杂度:O(n)
    * 空间复杂度:O(n)
    
  • 相关阅读:
    async/await的一些用法
    软件须把握两个点: 错误可控, 复杂度可控
    C++内存管理原则
    *复赛前提醒
    一些好用的网站
    NOIP真题汇总
    信息学中的一些些数论
    [Luogu 1052] noip 05 过河
    浅谈概率期望动态规划
    [Luogu 1312] noip11 Mayan游戏
  • 原文地址:https://www.cnblogs.com/worldline/p/15737242.html
Copyright © 2011-2022 走看看