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;
    }
}
一回生,二回熟
原文地址:https://www.cnblogs.com/zzytxl/p/12683085.html