题目大意
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
解题思路
方式一:中序遍历 升序
利用中序遍历 后,判断是否是升序即可,但凡有一个不是升序的直接就返回false
class Solution {TreeNode max;public boolean isValidBST(TreeNode root) {if (root == null) {return true;}//leftboolean left = isValidBST(root.left);if (!left) {return false;}if (max != null && root.val <= max.val) {return false;}max = root;//leftboolean right = isValidBST(root.right);return right;}
方式二:分治思想
class Solution {public boolean isValidBST(TreeNode root) {if (root == null) {return true;}return helper(root, null, null);}/*** 对于一个节点来说 先给他一个范围[min,max]* 判断当前节点v是否在这个范围里面,如果不在直接就return false ,否则继续递归* 递归操作时 左子树从 [min,v-1] ,对于右子树从[v+1,max]*/private boolean helper(TreeNode root, Integer min, Integer max) {if (root == null) {return true;}if ((max != null && root.val >= max) || (min != null && root.val <= min)) {return false;}//区间范围 [min,val]boolean left = helper(root.left, min, root.val);//[val,max]boolean right = helper(root.right, root.val, max);return left && right;x}}

