98. 验证二叉搜索树
题目:
思路:
【1】其实可以借鉴 530. 二叉搜索树的最小绝对差(783. 二叉搜索树节点最小距离) 这篇的逻辑,因为二叉搜索树最大的特点就是中序遍历会形成一个升序的数组,所以不满足该升序的就必然不是二叉搜索树。
代码展示:
//时间2 ms 击败 19.15% //内存42.9 MB 击败 17.64% /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isValidBST(TreeNode root) { ArrayList<Integer> rootList = new ArrayList<Integer>(); // 先中序遍历将结果集放入数组集合里面 inorderTraversal(root,rootList); // 遍历辅助空间集合 for (int i = 1; i < rootList.size(); i++){ if (rootList.get(i) <= rootList.get(i-1)) return false; } return true; } /** * 使用中序遍历 * @param root 树的遍历节点 * @param rootList 结果集存放的集合 */ private void inorderTraversal(TreeNode root , ArrayList rootList) { if (root.left != null) inorderTraversal(root.left , rootList); rootList.add(root.val); if (root.right != null) inorderTraversal(root.right, rootList); } } //时间0 ms 击败 100% //内存42.9 MB 击败 13.6% /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } /** * 利用中序遍历 * 有效 二叉搜索树定义如下: * 节点的左子树只包含 小于 当前节点的数。 * 节点的右子树只包含 大于 当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜索树。 * @param root 树节点 * @param lower 左边的节点值 * @param upper 右边的节点值 * @return */ private boolean isValidBST(TreeNode root, long lower, long upper) { if(null == root){ return true; } if(root.val <= lower || root.val >= upper){ return false; } return isValidBST(root.left, lower, root.val) && isValidBST(root.right, root.val, upper); } }