给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 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; } }