zoukankan      html  css  js  c++  java
  • 98. 验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

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

    示例 1:

    输入:
        2
       / 
      1   3
    输出: true
    

    示例 2:

    输入:
        5
       / 
      1   4
         / 
        3   6
    输出: false
    解释: 输入为: [5,1,4,null,null,3,6]。
         根节点的值为 5 ,但是其右子节点值为 4 。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        TreeNode preNode;
        public boolean isValidBST(TreeNode root) {
            // //错误示范 —— 右侧节点的所有值均需要大于根节点
            // if(root == null) return true;
            // TreeNode le = root.left;
            // TreeNode ri = root.right;
            // if(le == null || ri == null){
            //     if(le == null && ri == null){
            //         return true;
            //     }else if(le == null){
            //         return (ri.val > root.val) && isValidBST(ri);
            //     }else{
            //         return (le.val < root.val) && isValidBST(le);
            //     }
            // }
            // return isValidBST(le) && isValidBST(ri) && (le.val < root.val) && (ri.val > root.val);
            
            // 解法1——中序遍历
            // Stack<TreeNode> sta = new Stack<>();
            // long pre = Long.MIN_VALUE;
            // // int pre = Integer.MIN_VALUE;
            // while(root != null || !sta.isEmpty()){
            //     while(root != null){
            //         sta.push(root);
            //         root = root.left;
            //     }
            //     TreeNode node = sta.pop();
            //     if(node.val <= pre){
            //         return false;
            //     }
            //     pre = node.val;
            //     root = node.right;           
            // }
            // return true;
            
            //解法2——递归
            return isValid(root,null,null);
        }
        private boolean isValid(TreeNode root,Integer i1,Integer i2){
            if(root == null) return true;
            int val = root.val;
            if(i1 != null && val <= i1) return false; 
            if(i2 != null && val >= i2) return false;
            
            if(!isValid(root.left,i1,val)) return false;
            if(!isValid(root.right,val,i2)) return false;
            return true;
        }
    }
    一回生,二回熟
  • 相关阅读:
    ubuntu 1510
    创业者的困境
    创业者的窘境
    (转)Ubuntu 16.04下搭建Web服务器(MySQL+PHP+Apache)
    ESP8266的smartconfig过程(使用esptouch)
    Virtualbox下ubuntu识别USB设备
    红外人体检测
    树莓派跑讯飞语音识别(2麦阵列)
    R16平台中断
    语音识别下的智能家居
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12683085.html
Copyright © 2011-2022 走看看