题目:
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
方法一(自己想的):BST的中序是有序的,所以将BST中序遍历存入队列,判断队列是否递增
class Solution {public boolean isValidBST(TreeNode root) {LinkedList<Integer> queue = new LinkedList<Integer>();dfs(root,queue);int size = queue.size();if (size < 2)return true;Integer previous = queue.poll();while (!queue.isEmpty()) {Integer current = queue.poll();if (previous >= current)return false;previous = current;}return true;}public void dfs(TreeNode root, LinkedList<Integer> queue) {if (root == null)return;dfs(root.left, queue);queue.add(root.val);dfs(root.right, queue);}
}
时间复杂度 O( n )
空间复杂度 O( n )
方法二 (灵神):思路同一,只不过没有用队列存储,而是在递归的时候比较
class Solution {private long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null)return true;if (!isValidBST(root.left) || root.val <= pre)return false;pre = root.val;return isValidBST(root.right);}
}