从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结
98. 验证二叉搜索树
-
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 **大于 **当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。 -
示例 1:
输入:root = [2,1,3]
输出:true -
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。 -
提示:
树中节点数目范围在[1, 1 0 4 10^4 104] 内
− 2 31 -2^{31} −231 <= Node.val <= 2 31 − 1 2^{31}-1 231−1 -
中序遍历
- 中序遍历的节点值递增,注意边界
- 递归
class Solution { long last = Long.MIN_VALUE; public boolean isValidBST(TreeNode root) { if (root == null) { return true; } if (isValidBST(root.left)) { if (last < root.val) { last = root.val; return isValidBST(root.right); } } return false; } }
- 迭代
class Solution { public boolean isValidBST(TreeNode root) { long num = Long.MIN_VALUE; Deque<TreeNode> stack = new ArrayDeque<>(); TreeNode cur = root; while (cur != null || !stack.isEmpty()) { if (cur != null) { stack.push(cur); cur = cur.left; } else { cur = stack.pop(); if ((long)cur.val <= num) return false; num = (long)cur.val; cur = cur.right; } } return true; } }