题目
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
-
中序遍历,组成一个list,检查该list是否有序,若有序则为二叉搜索树
class Solution { public boolean isValidBST(TreeNode root) { List<Integer> list = inorder(root); if(isSorted(list))return true; return false; } List<Integer> inorder(TreeNode root){ if(root == null)return new LinkedList<Integer>(); List<Integer> left = inorder(root.left); List<Integer> right = inorder(root.right); left.addAll(Arrays.asList(root.val)); left.addAll(right); return left; } public boolean isSorted(List<Integer> list) { if(list.size()>1){ for(int i=0;i<list.size()-1;i++){ if(list.get(i)>=list.get(i+1))return false; } } return true; } }
-
因为对于每一个节点,它有最大值和最小值的限制,可以对每个结点检查是否处于最小值和最大值之间。
class Solution { public boolean isValidBST(TreeNode root) { return isValid(root,null,null); } public boolean isValid(TreeNode root,Integer min,Integer max){ if(root==null)return true; if(min!=null&&root.val<=min)return false; if(max!=null&&root.val>=max)return false; return isValid(root.left,min,root.val)&&isValid(root.right,root.val,max); } }